UDP服务器
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <sys/socket.h>
4 #include <arpa/inet.h>
5 #include <netinet/in.h>
6 #include <string.h>
7 #include <unistd.h>
8 #include <stdlib.h>
9
10 #define PORT 8888 //1024-49151
11 #define IP "192.168.124.105"
12
13 int main(int argc, const char *argv[])
14 {
15 //创建报式套接字文件
16 int sfd =socket(AF_INET,SOCK_DGRAM,0);
17 if(sfd<0)
18 {
19 fprintf(stderr,"line:%d ",__LINE__);
20 perror("socket");
21 return -1;
22 }
23 printf("创建报式套接字成功, sfd=%d __%d__\n",sfd,__LINE__);
24 //允许端口号被快速重复使用
25 int reuse = 1;
26 if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
27 {
28 fprintf(stderr, "line:%d ", __LINE__);
29 perror("setsockopt");
30 return -1;
31
32 }
33
34 //填充服务器的地址信息结构体,真实的地址信息结构体根据地址族制定 AF_INET-->》man 7 IP
35 struct sockaddr_in sin;
36 sin.sin_family =AF_INET;//必须填AF_INET;
37 sin.sin_port =htons(PORT);//端口的网络字节序1024-49151
38 sin.sin_addr.s_addr=inet_addr(IP);//服务器要运行的主机的IP的网络地址
39 //绑定服务器自身的地址信息---》必须绑定
40 if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0)
41 {
42 fprintf(stderr,"lin:%d ",__LINE__);
43 perror("bind");
44 return -1;
45 }
46 printf("bind success __%d__\n",__LINE__);
47 char buf[128]="";
48 struct sockaddr_in cin;//存储数据包发送方地址信息
49 socklen_t addrlen =sizeof(cin);
50 while(1)
51 {
52 bzero(buf,sizeof(buf));
53 //接收
54 if(recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen)<0)
55 {
56 fprintf(stderr,"line:%d ",__LINE__);
57 perror("recvfrom");
58 return -1;
59 }
60 printf("[%s:%d] %s __%d__\n",\
61 inet_ntoa(cin.sin_addr),htons(cin.sin_port),buf,__LINE__);
62
63 //发送
64 strcat(buf,"_");
65 if(sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,sizeof(cin))<0)
66 {
67 fprintf(stderr,"line:%d ",__LINE__);
68 perror("sendto");
69 return -1;
70 }
71 printf("发送成功\n");
72 }
73 //关闭文件描述符
74 close(sfd);
75
76 return 0;
77 }
UDP客户端
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <sys/socket.h>
4 #include <arpa/inet.h>
5 #include <netinet/in.h>
6 #include <string.h>
7 #include <unistd.h>
8 #include <stdlib.h>
9
10 #define SER_PORT 8888
11 #define SER_IP "192.168.124.105"
12
13 #define CLI_PORT 6666
14 #define CLI_IP "192.168.124.105"
15
16 int main(int argc, const char *argv[])
17 {
18 //创建报式套接字文件
19 int cfd =socket(AF_INET,SOCK_DGRAM,0);
20 if(cfd<0)
21 {
22 fprintf(stderr,"line:%d ",__LINE__);
23 perror("socket");
24 return -1;
25 }
26 printf("创建报式套接字成功, cfd=%d __%d__\n",cfd,__LINE__);
27 //允许端口号被快速重复使用
28 int reuse = 1;
29 if(setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
30 {
31 fprintf(stderr, "line:%d ", __LINE__);
32 perror("setsockopt");
33 return -1;
34
35 }
36
37 //填充客户端自身的地址信息
38 struct sockaddr_in cin;
39 cin.sin_family =AF_INET;//必须填AF_INET;
40 cin.sin_port =htons(CLI_PORT);//客户端需要绑定的端口号1024-49151
41 cin.sin_addr.s_addr=inet_addr(CLI_IP);//客户端需要绑定的IP
42 //填充服务器的地址信息结构体,给sendto函数使用
43 //指定要将数据包发送给谁
44 struct sockaddr_in sin;
45 sin.sin_family =AF_INET;//必须填AF_INET;
46 sin.sin_port =htons(SER_PORT);//服务器绑定的端口号
47 sin.sin_addr.s_addr=inet_addr(SER_IP);//服务器要运行的主机的IP的网络地址
48
49 char buf[128]="";
50 struct sockaddr_in rcvaddr;//存储数据包发送方地址信息
51 socklen_t addrlen =sizeof(rcvaddr);
52 while(1)
53 {
54 bzero(buf,sizeof(buf));
55 //发送
56 printf("请输入>>>");
57 fgets(buf,sizeof(buf),stdin);
58 buf[strlen(buf)-1]=0;
59 //将数据发送给服务器
60 if(sendto(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,sizeof(sin))<0)
61 {
62 fprintf(stderr,"line:%d ",__LINE__);
63 perror("sendto");
64 return -1;
65 }
66 printf("发送成功\n");
67 bzero(buf,sizeof(buf));
68 if(recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&rcvaddr,&addrlen)<0)
69 {
70 fprintf(stderr,"line:%d ",__LINE__);
71 perror("recvfrom");
72 return -1;
73 }
74 printf("[%s:%d] %s __%d__\n",\
75 inet_ntoa(rcvaddr.sin_addr),htons(rcvaddr.sin_port),buf,__LINE__);
76 }
77 //关闭文件描述符
78 close(cfd);
79
80 return 0;
81 }
82