logo

Programació de socket en C/C++

En el món actual, les xarxes informàtiques juguen un paper important en el camp de la transferència de dades. És un tema que cada programador ha de conèixer. Sota la xarxa informàtica, la programació de socket és un dels temes més importants del món de la programació. En aquest tema, estem fent una discussió sobre la programació de sockets i els diferents mètodes de programació de sockets que s'implementa en C++.

En C++, la programació de socket és un mètode que combina dos o més nodes entre si a través d'una xarxa perquè els nodes puguin compartir les dades sense cap pèrdua de dades. En aquesta connexió, un node escolta un port que està connectat a una adreça IP determinada. Quan el client arriba al servidor, el servidor crea l'escolta de socket.

Què és un Socket?

Entenem el sòcol parlant de l'exemple en temps real. Un endoll és un tipus de mitjà que proporciona una connexió entre dos dispositius. L'endoll pot ser un carregador de telèfon que proporciona la connexió entre l'endoll i el telèfon o el telèfon i aquest ordinador portàtil. Amb l'ajuda d'un sòcol, diferents aplicacions es connecten a la xarxa local amb diferents ports. Cada vegada que es crea el sòcol, el servidor especifica el programa, i aquest programa especifica el sòcol i l'adreça del domini.

barra d'adreces de Chrome

El sòcol és un tipus de mecanisme que s'utilitza per intercanviar dades entre diferents processos. Aquí aquests processos estan presents en diferents dispositius o en el mateix dispositiu que estan connectats a través d'una xarxa. Un cop creada la connexió per al sòcol, les dades es poden enviar en ambdues direccions i continuar fins que un dels punts finals tanca la connexió.

Programació de socket en C/C++

Procediment en comunicació client-servidor

Hi ha alguns procediments que hem de seguir per establir la comunicació client-servidor. Aquestes són les següents.

    Endoll:Amb l'ajuda d'un endoll, podem crear una nova comunicació.Enllaçar:Amb l'ajuda d'això podem, podem adjuntar l'adreça local amb el sòcol.Escolta:Amb aquesta ajuda; podem acceptar la connexió.Acceptar:Amb aquesta ajuda; podem bloquejar la connexió entrant fins que arribi la sol·licitud.Connectar:Amb aquesta ajuda; podem intentar establir la connexió.Envia:Amb l'ajuda d'això; podem enviar les dades per la xarxa.Rebre:Amb aquesta ajuda; podem rebre les dades a través de la xarxa.Tanca:Amb l'ajuda d'això, podem alliberar la connexió de la xarxa.

Etapes per a la creació del sòcol del servidor

Hi ha algunes etapes per les quals podem crear el sòcol per al servidor. Aquestes són les següents.

    int socketcr:Socket (domini, tipus, protocol)Socketcr:És un tipus enter i és com un controlador de fitxers.Domini:És un domini de comunicació i és de tipus enter.Tipus:És un tipus de comunicació.SOCK_DGRAM:És un tipus d'UDP poc fiable i sense connexió.Protocol:S'utilitza per assignar el valor del protocol per a l'adreça IP, que és 0. El valor del protocol és similar al valor que apareix al camp de protocol de la capçalera IP de la butxaca.

Què és una connexió?

Una connexió és un tipus de relació entre dues màquines on es coneixen els dos programaris. Aquests dos programes saben com establir una connexió entre ells; és a dir, podem dir que aquests dos programes saben com enviar els bits per la xarxa. Una connexió del sòcol significa que les dues màquines haurien de conèixer tota la informació entre elles, com ara el número de telèfon, l'adreça IP i el port TCP.

inurl:.git/head

Un sòcol és un tipus d'objecte que és similar al fitxer que permet al programa acceptar la connexió entrant i els permet enviar o rebre la connexió entrant. A més, és un tipus de recurs assignat al procés del servidor.

El servidor pot crear el sòcol amb l'ajuda del sòcol (). Aquest sòcol no es pot compartir amb cap altre processador.

    Setsockopt:Amb l'ajuda de Setsockopt, podem manipular les diferents opcions del sòcol, a les quals fa referència el descriptor del fitxer del sòcol. Aquest procés és totalment opcional. Amb l'ajuda de Setsockopt, podem reutilitzar el port i l'adreça del client i del servidor. Quan el servidor dóna l'error 'adreça ja en ús', podem evitar-ho amb l'ajuda de Setsockopt.Enllaçar:Podem vincular el sòcol amb l'adreça i el port amb l'ajuda de la funció de vinculació. Aquesta operació es realitza després de la creació del sòcol. Per exemple, si intentem vincular el servidor amb l'amfitrió local, utilitzarem INADDR_ANY per definir l'adreça IP del servidor.Escolta:Podem fer un sòcol en mode de connexió amb l'ajuda de la funció d'escolta (). Un exemple de sòcol de mode de connexió és SOCK_STREAM. Això es pot definir amb l'argument socket. S'utilitza per acceptar la connexió entrant, realitzar l'operació de cua per a la connexió entrant i realitzar l'endarreriment de la connexió entrant. Quan una connexió entrant sol·licita al servidor un reconeixement, el sòcol es posa en mode passiu. El paràmetre de backlog del servidor fa referència al fet que no pot permetre més d'una connexió alhora al servidor. Si ha arribat alguna connexió entrant i la cua està plena, el servidor proporciona l'error amb una indicació de 'ECONNREFUSED'. Amb l'ajuda de listen(), la connexió entrant està en espera i, quan la cua està buida, crida a totes les connexions entrants al servidor.Acceptar:Amb l'ajuda de la crida del sistema accept(); podem fer el sòcol basat en la connexió. Alguns endolls basats en connexió són SOCK_STREAMi SOCK_SEQPACKET. Extreu totes les connexions entrants que arriben primer i permet que la seva sol·licitud vagi al servidor. La llista acabada de connectar no pot escoltar amb l'ajuda d'un altre argument per a la creació del nou sòcol.

Etapes per al client

    Connexió de presa:És exactament el mateix que el mètode per a la creació del servidor.Connectar:Podem iniciar una connexió al sòcol amb l'ajuda de la crida del sistema connect(). Si el paràmetre del sòcol és un tipus de SOCK_DGRAM, podem definir el datagrama com a permanent amb l'ajuda de connect(). Si el sòcol és del tipus SOCK_STREAM, podem intentar fer una altra connexió per al servidor. Amb l'ajuda de la funció connect(), també podem crear una connexió per a l'associació estrangera. Si el sòcol no està vinculat, el sistema assigna el valor únic a l'associació local. Quan el sistema s'ha completat amb èxit les trucades, el sòcol està preparat per enviar o rebre qualsevol tipus de dades.Enviar/Rebre:Les funcions send() i recv() poden realitzar l'operació següent.
  • El sòcol on es poden comunicar les dades entre si.
  • La memòria intermèdia d'emmagatzematge pot emmagatzemar dades sobre l'adreça, com ara addr_of_data i addr_of_buffer.
  • S'ocupa de la mida del buffer, com len_of_data i len_of_buffer.
  • Tracta la bandera que diu com s'enviaran les dades.

Passos per establir la connexió al sòcol

Estableix una connexió entre els diferents clients i el servidor. Però tant el client com el servidor poden gestionar la connexió del sòcol. Cada procés ha d'establir una connexió per al seu propi sòcol.

Els passos necessaris per establir un sòcol al costat del client són els següents:

  • Crea un sòcol amb l'ajuda d'una crida al sistema socket().
  • Aleshores ens hem de connectar amb l'adreça de socket del servidor amb l'ajuda d'una trucada a system().
  • Després hem d'enviar i rebre les dades. Ho podem fer de diverses maneres. podem fer aquesta funció de llegir () i escriure ().

Els passos necessaris per establir un sòcol al costat del servidor són els següents:

model tcp ip
  • Primer crea un sòcol amb l'ajuda d'una trucada al sistema socket().
  • A continuació, enllaça el sòcol a una adreça amb l'ajuda de la crida al sistema bind(). Una adreça consisteix en un número de port per al sòcol del servidor a la màquina host.
  • A continuació, escolta la connexió amb l'ajuda de la trucada del sistema d'escolta ().
  • Aleshores, el servidor accepta la connexió entrant amb l'ajuda de la trucada al sistema accept(). També bloqueja totes les ordres entrants fins que un client estigui connectat a un servidor.
  • Aleshores comença el procés d'enviament i recepció de dades.

Connectar diversos clients sense multithreading

Hi ha diversos exemples en què veiem com un sol usuari es pot connectar amb el servidor. En el món de la programació actual, diversos usuaris estan connectats al servidor amb diferents endolls.

Hi ha diverses maneres d'aconseguir-ho. Un d'ells és el multithreading. Amb l'ajuda del multithreading, ho podem aconseguir. Podem implementar un procés multithreading amb l'ajuda de la funció select().

Exemple:

Codi per al client:

 // Client side C/C++ program to demonstrate Socket // programming #include #include #include #include #include #define PORT 8080 int main(int argc, char const* argv[]) { int sock = 0, valread, client_fd; struct sockaddr_in serv_addr; char* hello = &apos;Hello from client&apos;; char buffer[1024] = { 0 }; if ((sock = socket(AF_INET, SOCK_STREAM, 0)) <0) 0 8080 { printf('
 socket creation error 
'); return -1; } serv_addr.sin_family="AF_INET;" serv_addr.sin_port="htons(PORT);" convert ipv4 and ipv6 addresses from text to binary form if (inet_pton(af_inet, '127.0.0.1', &serv_addr.sin_addr) <="0)" printf( '
invalid address not supported ((client_fd="connect(sock," (struct sockaddr*)&serv_addr, sizeof(serv_addr))) 0) printf('
connection failed send(sock, hello, strlen(hello), 0); printf('hello message sent
'); valread="read(sock," buffer, 1024); printf('%s
', buffer); closing the connected close(client_fd); 0; code for server: server side c c++ program demonstrate programming #include #define port int main(int argc, char const* argv[]) server_fd, new_socket, valread; struct sockaddr_in address; opt="1;" addrlen="sizeof(address);" buffer[1024]="{" }; char* hello="Hello from server" ; creating file descriptor ((server_fd="socket(AF_INET," sock_stream, 0)) perror('socket failed'); exit(exit_failure); forcefully attaching (setsockopt(server_fd, sol_socket, so_reuseaddr | so_reuseport, &opt, sizeof(opt))) perror('setsockopt'); address.sin_family="AF_INET;" address.sin_addr.s_addr="INADDR_ANY;" address.sin_port="htons(PORT);" (bind(server_fd, sockaddr*)&address, sizeof(address)) perror('bind (listen(server_fd, 3) perror('listen'); ((new_socket="accept(server_fd," (socklen_t*)&addrlen)) perror('accept'); send(new_socket, close(new_socket); listening shutdown(server_fd, shut_rdwr); pre> <p> <strong>Compiling:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/33/socket-programming-c-c-2.webp" alt="Socket Programming in C/C++"> <p> <strong>Output:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/33/socket-programming-c-c-3.webp" alt="Socket Programming in C/C++"> <h2>Uses of Socket Programming</h2> <p>Socket programs are used to communicate between various processes, usually running on different systems. It is mostly used to create a client-server environment. This post provides the various functions used to create the server and client program and an example program.</p> <p>In the example, the client program sends a file name to the server, and the server sends the contents of the file back to the client. Socket programming usually pertains to basic communication protocols like TCP/UDP and raw sockets like ICMP. These protocols have a small communication overhead when compared to underlying protocols such as HTTP/DHCP/SMTP etc.</p> <p> <strong>Some of the basic data communications between the client and server are:</strong> </p> <ul> <li>File Transfer: Sends name and gets a file.</li> <li>Web Page: Sends URL and gets a page.</li> <li>Echo: Sends a message and gets it back.</li> </ul> <h2>Disadvantages</h2> <ul> <li>C++ can establish communication only with the machine requested and not with any other machine on the network.</li> <li>Sockets allow only raw data to be sent. This means that the client and server need mechanisms to interpret the data.</li> </ul> <hr></0)>