Ejemplo de programación UDP
Cuando se usa el protocolo UDP para comunicarse, el servidor y el cliente no necesitan establecer una conexión, siempre que conozcan la información de la dirección del socket del otro, pueden enviar datos. El servidor solo necesita crear un socket para recibir solicitudes de diferentes clientes y enviar el resultado al cliente correspondiente después del procesamiento.
El proceso de usar UDP en el lado del servidor y en el lado del cliente es el siguiente:
código del lado del servidor
/*****server.c*****/
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define BUFFER_SIZE 128
int main(int argc, char *argv[]){
int sockfd;
struct sockaddr_in servaddr, cliaddr;
socklen_t peerlen;
char[BUFFER_SIZE];
if(argc < 3){
printf("Usage: %s <ip> <port>\n",argv[0]);
exit(-1);
}
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1){
//建立socket连接
perror("socket");
exit(-1);
}
print("sockfd = %d\n",sockfd);
//设置sockaddr_in结构体中相关参数
bzero(&servaddr,szieof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(atoi(argv[2]));
servaddr.sin_addr.s_addr = inet_addr(argv[1]);
if(bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){
//bind()绑定地址信息
perror("bind");
exit(-1);
}
printf("bind success!\n");
peerlen = sizeof(cliaddr);
while(1){
//调用recvfrom()函数接收客户端发送的数据
if(recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&cliaddr, &peerlen) < 0){
perror("recvfrom");
exit(-1);
}
printf("Received a message: %s\n",buf);
strcpy(buf, "Welcome to server");
sendto(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&cliaddr, peerlen);
}
close(sockfd);
exit(0);
}
Codigo del cliente
/*****client.c*****/
//头文件同server.c
#define BUFFER_SIZE 128
int main(int argc, char *argv[]){
int sockfd;
char buf[BUFFER_SIZE] = "Hello Server";
struct sockaddr_in servaddr;
if(argc < 3){
printf("Usage: %s <ip> <port>\n",argv[0]);
exit(-1);
}
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1){
//创建socket
perror("socket");
exit(-1);
}
//设置sockaddr_in结构体中相关参数
bzero(&servaddr,szieof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(atoi(argv[2]));
servaddr.sin_addr.s_addr = inet_addr(argv[1]);
sendto(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&servaddr, sizeof(servaddr)); //发送消息给服务器端
if(recvfrom(sockfd, buf, sizeof(buf), 0, NULL, NULL) < 0){
perror("recvfrom");
exit(-1);
}
printf("Recv from server: %s\n",buf);
close(sockfd);
exit(0);
}
Cuando se ejecuta, inicie primero el servidor y luego inicie el cliente
linux@linux-virtual-machine:~/andy/net$ ./server 192.168.1.100 9999
listenfd = 3
bind success!
Listening...
Received a message: Hello Server
linux@linux-virtual-machine:~/andy/net$ ./client 192.168.1.100 9999
Recv from server: Welcome to server