UDP协议的主要特点:
UDP是无连接的
UDP使用尽最大努力交付
UDP是面向报文的
没有拥塞控制
支持一对一、一对多、多对一、多对多的交互通信
UDP首部开销小
UDP协议是无连接的并且面向数据块的。所以client端不需要与server端进行连接,直接发送消息。
server:
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<sys/types.h>
4 #include<sys/socket.h>
5 #include<netinet/in.h>
6 #include<arpa/inet.h>
7 #include<string.h>
8 void usage(char *port)
9 {
10 printf("%s,[ip],[port]\n",port);
11 }
12 int main(int argc,char *argv[])
13 {
14 if(argc!=3)
15 {
16 usage(argv[0]);
17 exit(1);
18 }
19 int sock = socket(AF_INET,SOCK_DGRAM,0); //创建套接字
20 if(sock<0)
21 {
22 perror("socket");
23 return 1;
24 }
25 int port = atoi(argv[2]);
26 char *ip = argv[1];
27 struct sockaddr_in client;
28 client.sin_family = AF_INET;
29 client.sin_port = htons(port);
30 client.sin_addr.s_addr = inet_addr(ip);
31 if(bind(sock,(struct sockaddr*)&client,sizeof(client))<0)
32 {
33 perror("bind");
34 exit(1);
35 }
36 char buf[1024];
37 struct sockaddr_in remote;
38 socklen_t len = sizeof(remote);
39 while(1)
40 {
41 ssize_t size = recvfrom(sock,buf,sizeof(buf),0,(struct sockaddr*)&re mote,&len); //接收消息
42 if(size>0)
43 {
44 buf[size-1]='\0';
45 printf("%s,%d: %s\n",inet_ntoa(remote.sin_addr),ntohs(remote.sin _port),buf);
46
47 }
48 else if(size==0)
49 {}
50 else
51 {
52 perror("recvfrom");
53 exit(2);
54 }
55 fflush(stdout);
56 }
57 return 0;
58 }
client:
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<sys/types.h>
4 #include<sys/socket.h>
5 #include<string.h>
6 #include<unistd.h>
7 #include<netinet/in.h>
8 #include<arpa/inet.h>
9 void usage(char *port)
10 {
11 printf("%s,[ip],[port]\n",port);
12 }
13 int main(int argc,char *argv[])
14 {
15 if(argc!=3)
16 {
17 usage(argv[0]);
18 exit(1);
19 }
20 int sock = socket(AF_INET,SOCK_DGRAM,0);
21 if(sock<0)
22 {
23 perror("socket");
24 return 1;
25 }
26 int port = atoi(argv[2]);
27 char *ip = argv[1];
28 struct sockaddr_in remote;
29 remote.sin_family = AF_INET;
30 remote.sin_port = htons(port);
31 remote.sin_addr.s_addr = inet_addr(ip);
32 char buf[1024];
33 while(1)
34 {
35 memset(buf,'\0',sizeof(buf));
36 ssize_t _s = read(0,buf,sizeof(buf)-1);
37 if(_s<0)
38 {
39 perror("read");
40 exit(1);
41 }
42 ssize_t size = sendto(sock,buf,strlen(buf),0,(struct sockaddr*)&remo te,sizeof(remote)); //发送消息
43 if(size<0)
44 {
45 perror("sendto");
46 exit(1);
47 }
48
49 }
50 return 0;
51 }
[fbl@localhost udp]$ ./server 192.168.1.106 8080
192.168.1.106,33647: how are you
192.168.1.106,33647: hi
192.168.1.106,33647: hnxu
^C
[fbl@localhost udp]$
[fbl@localhost udp]$ ./client 192.168.1.106 8080
how are you
hi
hnxu
^C
[fbl@localhost udp]$
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。