logo

Programación de sockets en C/C++

En el mundo actual, las redes informáticas desempeñan un papel importante en el campo de la transferencia de datos. Es un tema que todo programador debería conocer. En la red informática, la programación de sockets es uno de los temas más importantes en el mundo de la programación. En este tema, vamos a discutir la programación de sockets y los diferentes métodos de programación de sockets que se implementan en C++.

En C++, la programación de sockets es un método que combina dos o más nodos entre sí a través de una red para que los nodos puedan compartir los datos sin ninguna pérdida. En esta conexión, un nodo escucha un puerto que está conectado a una dirección IP particular. Cuando el cliente llega al servidor, el servidor crea el detector de socket.

¿Qué es un enchufe?

Entendamos el socket hablando con el ejemplo en tiempo real. Un socket es un tipo de medio que proporciona una conexión entre dos dispositivos. El enchufe puede ser un cargador de teléfono que proporciona la conexión entre el enchufe y el teléfono o el teléfono y esa computadora portátil. Con la ayuda de un socket se conectan diferentes aplicaciones a la red local con diferentes puertos. Cada vez que se crea el socket, el servidor especifica el programa, y ​​ese programa especifica el socket y la dirección de dominio.

java booleano a cadena

El socket es un tipo de mecanismo que se utiliza para intercambiar datos entre diferentes procesos. Aquí estos procesos están presentes en diferentes dispositivos o en el mismo dispositivo que están conectados a través de una red. Una vez que se crea la conexión para el socket, los datos se pueden enviar en ambas direcciones y continúan hasta que uno de los puntos finales cierra la conexión.

Programación de sockets en C/C++

Procedimiento en la Comunicación Cliente-Servidor

Hay algunos procedimientos que tenemos que seguir para establecer la comunicación cliente-servidor. Estos son los siguientes.

    Enchufe:Con la ayuda de un socket podemos crear una nueva comunicación.Unir:Con la ayuda de esto podemos adjuntar la dirección local al socket.Escuchar:Con esta ayuda; Podemos aceptar la conexión.Aceptar:Con esta ayuda; Podemos bloquear la conexión entrante hasta que llegue la solicitud.Conectar:Con esta ayuda; podemos intentar establecer la conexión.Enviar:Con la ayuda de esto; Podemos enviar los datos a través de la red.Recibir:Con esta ayuda; Podemos recibir los datos a través de la red.Cerca:Con la ayuda de esto, podemos liberar la conexión de la red.

Etapas para la creación de sockets de servidor

Hay algunas etapas mediante las cuales podemos crear el socket para el servidor. Estos son los siguientes.

    int socketcr:Socket(dominio, tipo, protocolo)Enchufecr:Es de tipo entero y es como un controlador de archivos.Dominio:Es un dominio de comunicación y es de tipo entero.Tipo:Es un tipo de comunicación.SOCK_DGRAM:Es un tipo de UDP que no es confiable y no tiene conexión.Protocolo:Se utiliza para asignar el valor de protocolo para la dirección IP, que es 0. El valor de protocolo es similar al valor que aparece en el campo de protocolo del encabezado IP del bolsillo.

¿Qué es una conexión?

Una conexión es un tipo de relación entre dos máquinas en la que los dos software se conocen entre sí. Estos dos software saben cómo establecer una conexión entre sí; en otras palabras, podemos decir que estos dos software saben enviar los bits a través de la red. Una conexión del socket significa que las dos máquinas deben conocer toda la información entre sí, como el número de teléfono, la dirección IP y el puerto TCP.

1 a 100 número romano

Un socket es un tipo de objeto similar al archivo que permite al programa aceptar la conexión entrante y permitirle enviar o recibir la conexión entrante. Además, es un tipo de recurso asignado al proceso del servidor.

El servidor puede crear el socket con la ayuda de socket(). Este zócalo no se puede compartir con ningún otro procesador.

    Conjuntosockopt:Con la ayuda de Setsockopt, podemos manipular las diversas opciones del socket, a las que hace referencia el descriptor de archivo del socket. Este proceso es completamente opcional. Con la ayuda de Setsockopt, podemos reutilizar el puerto y la dirección del cliente y del servidor. Cuando el servidor muestra el error 'dirección ya en uso', podemos evitarlo con la ayuda de Setsockopt.Unir:Podemos vincular el socket con la dirección y el puerto con la ayuda de la función de vinculación. Esta operación se realiza después de la creación del socket. Por ejemplo, si intentamos vincular el servidor con el host local, usamos INADDR_ANY para definir la dirección IP del servidor.Escuchar:Podemos crear un socket de modo de conexión con la ayuda de la función de escucha (). Un ejemplo de un socket de modo de conexión es SOCK_STREAM. Esto se puede definir mediante el argumento del socket. Esto se utiliza para aceptar la conexión entrante, realizar la operación de cola para la conexión entrante y realizar el trabajo pendiente de la conexión entrante. Cuando una conexión entrante solicita confirmación al servidor, el socket se pone en modo pasivo. El parámetro backlog del servidor se refiere al hecho de que no puede permitir más de una conexión al servidor a la vez. Si se ha producido alguna conexión entrante y la cola está llena, entonces el servidor proporciona el error con una indicación de 'ECONREFUSED'. Con la ayuda de listening(), la conexión entrante está en espera y, cuando la cola está vacía, llama a todas las conexiones entrantes al servidor.Aceptar:Con la ayuda de la llamada al sistema aceptar(); Podemos hacer el socket basado en conexión. Algunos sockets basados ​​en conexión son SOCK_STREAM y SOCK_SEQPACKET. Extrae todas las conexiones entrantes que llegan primero y permite que su solicitud vaya al servidor. La lista recién conectada no puede escuchar con la ayuda de otro argumento para la creación del nuevo socket.

Etapas para el cliente

    Conexión de enchufe:Es exactamente el mismo que el método para la creación del servidor.Conectar:Podemos iniciar una conexión al socket con la ayuda de la llamada al sistema connect(). Si el parámetro del socket es un tipo SOCK_DGRAM, entonces podemos definir el datagrama como permanente con la ayuda de connect(). Si el socket es del tipo SOCK_STREAM, entonces podemos intentar establecer otra conexión para el servidor. Con la ayuda de la función connect(), también podemos crear una conexión para la asociación extranjera. Si el socket no está vinculado, el sistema asigna el valor único a la asociación local. Cuando las llamadas del sistema se completan con éxito, el socket está listo para enviar o recibir cualquier tipo de datos.Enviar recibir:Las funciones send() y recv() pueden realizar la siguiente operación.
  • El socket en el que los datos se pueden comunicar entre sí.
  • El búfer de almacenamiento puede almacenar datos sobre la dirección, como addr_of_data y addr_of_buffer.
  • Se ocupa del tamaño del búfer, como len_of_data y len_of_buffer.
  • Se trata de la bandera que dice cómo se enviarán los datos.

Pasos para establecer la conexión en el socket

Establece una conexión entre los diferentes clientes y el servidor. Pero tanto el cliente como el servidor pueden manejar la conexión de socket. Cada proceso tiene que establecer una conexión para su propio socket.

Los pasos necesarios para establecer un socket en el lado del cliente son los siguientes:

  • Crea un socket con la ayuda de una llamada al sistema socket().
  • Luego tenemos que conectarnos con la dirección del socket del servidor con la ayuda de una llamada al sistema().
  • Luego tenemos que enviar y recibir los datos. Podemos hacer esto de varias maneras. Podemos hacer esta función de lectura() y escritura().

Los pasos necesarios para establecer un socket en el lado del servidor son los siguientes:

Sitios web de películas similares a 123movies.
  • Primero crea un socket con la ayuda de una llamada al sistema socket().
  • Luego vincula el socket a una dirección con la ayuda de la llamada al sistema bind(). Una dirección consta de un número de puerto para el socket del servidor en la máquina host.
  • Luego escucha la conexión con la ayuda de la llamada al sistema listening ().
  • Luego, el servidor acepta la conexión entrante con la ayuda de la llamada al sistema aceptar(). También bloquea todos los comandos entrantes hasta que un cliente se conecta a un servidor.
  • Luego comienza el proceso de envío y recepción de datos.

Conexión de varios clientes sin subprocesos múltiples

Hay varios ejemplos en los que vemos cómo un único usuario puede conectarse con el servidor. En el mundo de la programación actual, varios usuarios están conectados al servidor con diferentes sockets.

Hay varias formas de lograrlo. Uno de ellos es el multiproceso. Con la ayuda de subprocesos múltiples, podemos lograr esto. Podemos implementar un proceso de subprocesos múltiples con la ayuda de la función select().

Ejemplo:

Código para el cliente:

 // 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)>