Requisito previo: Programación de sockets en C/C++ .
En la programación de sockets, cuando el servidor y el cliente están conectados, un sistema operativo proporciona al cliente un número de puerto aleatorio para que se ejecute y, en general, no nos importa, pero en algunos casos, puede haber un firewall en el cliente. lado que solo permite conexiones salientes en ciertos números de puerto. Por lo tanto, es muy probable que el firewall del cliente haya bloqueado el número de puerto proporcionado al cliente por el sistema operativo. En ese caso, debemos asignar de forma explícita o forzosa cualquier número de puerto al cliente en el que pueda operar.
Algunos protocolos, como el protocolo NFS , requieren que el programa del cliente se ejecute solo en un determinado número de puerto y, por lo tanto, en este caso, el cliente debe asignar a la fuerza ese número de puerto solo cuando se ejecuta en el número de puerto, ya sea en 111 o en 2049. Esto se puede hacer usando una llamada al sistema bind() especificando un número de puerto particular en un socket del lado del cliente.
A continuación se muestra la implementación del programa Servidor y Cliente, donde a un cliente se le asignará por la fuerza un número de puerto.
Programa del lado del servidor
C
// C program to demonstrate // socket programming in finding ip address // and port number of connected client // on Server Side #include<stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<sys/un.h> #include<string.h> #include<netdb.h> #include<netinet/in.h> #include<arpa/inet.h> #include<string.h> int main() { // Two buffers for message communication char buffer1[256], buffer2[256]; int server = socket(AF_INET, SOCK_STREAM, 0); if (server < 0) printf("Error in server creating\n"); else printf("Server Created\n"); struct sockaddr_in my_addr, peer_addr; my_addr.sin_family = AF_INET; my_addr.sin_addr.s_addr = INADDR_ANY; // This ip address will change according to the machine my_addr.sin_addr.s_addr = inet_addr("10.32.40.213"); my_addr.sin_port = htons(12000); if (bind(server, (struct sockaddr*) &my_addr, sizeof(my_addr)) == 0) printf("Binded Correctly\n"); else printf("Unable to bind\n"); if (listen(server, 3) == 0) printf("Listening ...\n"); else printf("Unable to listen\n"); socklen_t addr_size; addr_size = sizeof(struct sockaddr_in); // Ip character array will store the ip address of client char *ip; // while loop is iterated infinitely to // accept infinite connection one by one while (1) { int acc = accept(server, (struct sockaddr*) &peer_addr, &addr_size); printf("Connection Established\n"); char ip[INET_ADDRSTRLEN]; inet_ntop(AF_INET, &(peer_addr.sin_addr), ip, INET_ADDRSTRLEN); // "ntohs(peer_addr.sin_port)" function is // for finding port number of client printf("connection established with IP : %s and PORT : %d\n", ip, ntohs(peer_addr.sin_port)); recv(acc, buffer2, 256, 0); printf("Client : %s\n", buffer2); strcpy(buffer1, "Hello"); send(acc, buffer1, 256, 0); } return 0; }
Producción:
Server Created Binded Correctly Listening ... Connection Established connection established with IP : 10.32.40.213 and PORT : 12010 Client : Hello
Programa del lado del cliente
C
// C program to demonstrate socket programming // as well as explicitly assigning a port number // on Client Side #include<stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<sys/un.h> #include<string.h> #include<netdb.h> #include<netinet/in.h> #include<arpa/inet.h> #include<stdlib.h> int main() { // Two buffer are for message communication char buffer1[256], buffer2[256]; struct sockaddr_in my_addr, my_addr1; int client = socket(AF_INET, SOCK_STREAM, 0); if (client < 0) printf("Error in client creating\n"); else printf("Client Created\n"); my_addr.sin_family = AF_INET; my_addr.sin_addr.s_addr = INADDR_ANY; my_addr.sin_port = htons(12000); // This ip address will change according to the machine my_addr.sin_addr.s_addr = inet_addr("10.32.40.213"); // Explicitly assigning port number 12010 by // binding client with that port my_addr1.sin_family = AF_INET; my_addr1.sin_addr.s_addr = INADDR_ANY; my_addr1.sin_port = htons(12010); // This ip address will change according to the machine my_addr1.sin_addr.s_addr = inet_addr("10.32.40.213"); if (bind(client, (struct sockaddr*) &my_addr1, sizeof(struct sockaddr_in)) == 0) printf("Binded Correctly\n"); else printf("Unable to bind\n"); socklen_t addr_size = sizeof my_addr; int con = connect(client, (struct sockaddr*) &my_addr, sizeof my_addr); if (con == 0) printf("Client Connected\n"); else printf("Error in Connection\n"); strcpy(buffer2, "Hello"); send(client, buffer2, 256, 0); recv(client, buffer1, 256, 0); printf("Server : %s\n", buffer1); return 0; }
Producción:
Client Created Binded Correctly Client Connected Server : Hello
Referencia : https://stackoverflow.com/questions/4118241/what-client-side-situations-need-bind
Este artículo es una contribución de Aditya Kumar . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA