UDP实现并发服务器

server端

 1 #include <string.h>
 2 #include <stdio.h>
 3 #include <unistd.h>
 4 #include <arpa/inet.h>
 5 #include <ctype.h>
 6 
 7 #define SERV_PORT 8000
 8 
 9 int main(void)
10 {
11     struct sockaddr_in serv_addr, clie_addr;
12     socklen_t clie_addr_len;
13     int sockfd;
14     char buf[BUFSIZ];
15     char str[INET_ADDRSTRLEN];
16     int i, n;
17 
18     sockfd = socket(AF_INET, SOCK_DGRAM, 0);    //SOCK_DGRAM通过UDP创建套接字
19 
20     bzero(&serv_addr, sizeof(serv_addr)); //初始化地址信息
21     serv_addr.sin_family = AF_INET;
22     serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
23     serv_addr.sin_port = htons(SERV_PORT);
24 
25     bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));  //绑定 服务器端 地址
26 
27     printf("Accepting connections ...
");
28     while (1) {
29         clie_addr_len = sizeof(clie_addr);
30         n = recvfrom(sockfd, buf, BUFSIZ,0, (struct sockaddr *)&clie_addr, &clie_addr_len);    //从sockfd读数据,将数据来源保存在clie_addr中
31         if (n == -1)
32             perror("recvfrom error");
33 
34         printf("received from %s at PORT %d
",
35                 inet_ntop(AF_INET, &clie_addr.sin_addr, str, sizeof(str)),
36                 ntohs(clie_addr.sin_port));
37 
38         for (i = 0; i < n; i++)
39             buf[i] = toupper(buf[i]);
40 
41         n = sendto(sockfd, buf, n, 0, (struct sockaddr *)&clie_addr, sizeof(clie_addr));   //往sockfd写数据,并发送给 clie_addr
42         if (n == -1)
43             perror("sendto error");
44     }
45     close(sockfd);
46 
47     return 0;
48 }

客户端

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <unistd.h>
 4 #include <arpa/inet.h>
 5 #include <ctype.h>
 6 
 7 #define SERV_PORT 8000
 8 
 9 int main(int argc, char *argv[])
10 {
11     struct sockaddr_in servaddr;
12     int sockfd, n;
13     char buf[BUFSIZ];
14 
15     sockfd = socket(AF_INET, SOCK_DGRAM, 0);   //SOCK_DGRAM通过 UDP 创建套接字
16 
17     bzero(&servaddr, sizeof(servaddr));
18     servaddr.sin_family = AF_INET;
19     inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);
20     servaddr.sin_port = htons(SERV_PORT);
21 
22     while (fgets(buf, BUFSIZ, stdin) != NULL) {
23         n = sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *)&servaddr, sizeof(servaddr)); //向sockfd写数据,发送给 servaddr
24         if (n == -1)
25             perror("sendto error");
26 
27         n = recvfrom(sockfd, buf, BUFSIZ, 0, NULL, 0);         //NULL:不关心对端信息
28         if (n == -1)
29             perror("recvfrom error");
30 
31         write(STDOUT_FILENO, buf, n);
32     }
33 
34     close(sockfd);
35 
36     return 0;
37 }
原文地址:https://www.cnblogs.com/sclu/p/11310957.html