UDP es un protocolo sin conexión. No se establece ninguna conexión entre el cliente y el servidor. Aquí se analiza la creación de un cliente/servidor UDP estándar
Prerrequisito: Programación de sockets en C/CPP | Implementación servidor-cliente UDP
En UDP, el cliente no forma una conexión con el servidor como en TCP, sino que simplemente envía un datagrama. De manera similar, el servidor no necesita aceptar una conexión y solo espera a que lleguen los datagramas. Podemos llamar a una función llamada connect() en UDP pero no da como resultado nada parecido a TCP. No hay apretón de manos de 3 vías. Simplemente verifica si hay errores inmediatos y almacena la dirección IP y el número de puerto del compañero. connect() está almacenando la dirección de los pares, por lo que no es necesario pasar la dirección del servidor y los argumentos de longitud de la dirección del servidor en sendto() .
Funciones necesarias:
int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen); returns : 0 if OK -1 on error arguments : sockfd : File descriptor of socket to be connected. struct sockaddr *servaddr : server address structure. addrlen : length of server address structure.
A continuación se muestra la implementación que muestra la transferencia de mensajes entre el servidor y el cliente:
Código del servidor UDP:
// server program for udp connection #include <stdio.h> #include <strings.h> #include <sys/types.h> #include <arpa/inet.h> #include <sys/socket.h> #include<netinet/in.h> #define PORT 5000 #define MAXLINE 1000 // Driver code int main() { char buffer[100]; char *message = "Hello Client"; int listenfd, len; struct sockaddr_in servaddr, cliaddr; bzero(&servaddr, sizeof(servaddr)); // Create a UDP Socket listenfd = socket(AF_INET, SOCK_DGRAM, 0); servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(PORT); servaddr.sin_family = AF_INET; // bind server address to socket descriptor bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)); //receive the datagram len = sizeof(cliaddr); int n = recvfrom(listenfd, buffer, sizeof(buffer), 0, (struct sockaddr*)&cliaddr,&len); //receive message from server buffer[n] = '\0'; puts(buffer); // send the response sendto(listenfd, message, MAXLINE, 0, (struct sockaddr*)&cliaddr, sizeof(cliaddr)); }
Código de cliente UDP:
// udp client driver program #include <stdio.h> #include <strings.h> #include <sys/types.h> #include <arpa/inet.h> #include <sys/socket.h> #include<netinet/in.h> #include<unistd.h> #include<stdlib.h> #define PORT 5000 #define MAXLINE 1000 // Driver code int main() { char buffer[100]; char *message = "Hello Server"; int sockfd, n; struct sockaddr_in servaddr; // clear servaddr bzero(&servaddr, sizeof(servaddr)); servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); servaddr.sin_port = htons(PORT); servaddr.sin_family = AF_INET; // create datagram socket sockfd = socket(AF_INET, SOCK_DGRAM, 0); // connect to server if(connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { printf("\n Error : Connect Failed \n"); exit(0); } // request to send datagram // no need to specify server address in sendto // connect stores the peers IP and port sendto(sockfd, message, MAXLINE, 0, (struct sockaddr*)NULL, sizeof(servaddr)); // waiting for response recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr*)NULL, NULL); puts(buffer); // close the descriptor close(sockfd); }
Salidas:
Publicación traducida automáticamente
Artículo escrito por Mohityadav y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA