UDP服务器
1 #include <stdio.h>
2 #include <myhead.h>
3
4 #define PORT 8888 //1024-49251
5 #define IP "192.168.124.17" //ifconfig查找本机的Ip地址
6 int main(int argc, const char *argv[])
7 {
8
9 //创建报式套接字
10 int sfd = socket(AF_INET,SOCK_DGRAM,0);
11 if(sfd<0)
12 {
13 fprintf(stderr,"line:%d",__LINE__);
14 perror("socket");
15 return -1;
16 }
17 printf("创建报式套接字成功 sfd = %d __%d__\n",sfd,__LINE__);
18 //允许端口号被快速重复使用
19 int reuse = 1;
20 if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0)
21 {
22 fprintf(stderr,"line:%d",__LINE__);
23 perror("setsockopt");
24 return -1;
25
26 }
27 //填充服务器的地址信息结构体,真实的地址信息结构体根据地址族判定
28 //AF_INET --->man 7 ip
29 struct sockaddr_in sin;
30 sin.sin_family = AF_INET; //必须填AF_INET(PIV4)
31 sin.sin_port = htons(PORT); //端口号的网络字节序
32 sin.sin_addr.s_addr = inet_addr(IP);//服务器要运行的主机的IP的网络地址
33 //ifconfig查找本机的IP地址
34 //绑定服务器自身的地址信息--->必须绑定
35 if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0)
36 {
37
38 fprintf(stderr,"line:%d",__LINE__);
39 perror("bind");
40 return -1;
41 }
42 printf("bind success __%d__\n",__LINE__);
43
44
45
46 char buf[128] = "";//存储数据包发送方的地址信息
47 struct sockaddr_in cin;
48 socklen_t addrlen = sizeof(cin);
49 while(1)
50 {
51 bzero(buf,sizeof(buf));
52 //接收
53 if(recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen)<0)
54 {
55
56
57 fprintf(stderr,"line:%d",__LINE__);
58 perror("recvfrom");
59 return -1;
60
61 }
62 printf("[%s:%d] : %s __%d__\n",inet_ntoa(cin.sin_addr),\
63 htons(cin.sin_port),buf,__LINE__);
64
65 //发送
66 strcat(buf,"*_*");
67 if(sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,sizeof(cin))<0)
68 {
69
70 fprintf(stderr,"line:%d",__LINE__);
71 perror("sendto");
72 return -1;
73
74 }
75 printf("发送成功\n");
76
77 }
78 //关闭
79 close(sfd);
80 return 0;
81
82 }
~
~
~
~
UDP客服端
1 #include <stdio.h>
2 #include <myhead.h>
3
4 #define SER_PORT 8888 // 接收方的端口
5 #define SER_IP "192.168.124.17" // 接收方的IP
6
7 #define CLI_PORT 6666
8 #define CLI_IP "192.168.124.17"
9
10 int main(int argc, const char *argv[])
11 {
12
13 //创建报式套接字
14 int cfd = socket(AF_INET,SOCK_DGRAM,0);
15 if(cfd<0)
16 {
17 fprintf(stderr,"line:%d",__LINE__);
18 perror("socket");
19 return -1;
20 }
21 printf("创建报式套接字成功 sfd = %d __%d__\n",cfd,__LINE__);
22 //绑定客服端自身地址信息结构体-->非必须绑定
23 //若不绑定,则操作系统会自动给客服端所运行主机的IP及随机端口:49152~65535
24 以下绑定客户端的地址,可以不写///
25 //允许端口号被快速重复使用
26 int reuse = 1;
27 if(setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0)
28 {
29 fprintf(stderr,"line:%d",__LINE__);
30 perror("setsockopt");
31 return -1;
32
33 }
34 //填充客户端自身的地址信息
35 //AF_INET --->man 7 ip
36 struct sockaddr_in cin;
37 cin.sin_family = AF_INET; //必须填AF_INET(PIV4)
38 cin.sin_port = htons(CLI_PORT); //客户端需要绑定的端口号1024~49151
39 cin.sin_addr.s_addr = inet_addr(CLI_IP);//客户端需要绑定的IP
40 //ifconfig查找本机的IP地址
41 //绑定服务器自身的地址信息--->必须绑定
42 if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))<0)
43 {
44
45 fprintf(stderr,"line:%d",__LINE__);
46 perror("bind");
47 return -1;
48 }
49 printf("bind [%s:%d]success __%d__\n",CLI_IP,CLI_PORT,__LINE__);
50
51
52 //填充服务器的地址信息结构体,给sendto函数使用
53 //指定要将数据包发送给谁
54 //AF_INET ---> man 7 ip
55 struct sockaddr_in sin;
56 sin.sin_family = AF_INET; //必须填AF_INET(PIV4)
57 sin.sin_port = htons(SER_PORT); //服务器绑定的端口号
58 sin.sin_addr.s_addr = inet_addr(SER_IP);//服务器绑定的IP
59
60 char buf[128] = "";
61 struct sockaddr_in rcvaddr;//存储数据包发送方的地址信息
62 socklen_t addrlen = sizeof(rcvaddr);
63 while(1)
64 {
65 bzero(buf,sizeof(buf));
66 //发送
67 printf("请输入》》");
68 fgets(buf,sizeof(buf),stdin);
69 buf[strlen(buf)-1]='\0';
70
71 if(sendto(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,sizeof(sin))<0)
72 {
73
74 fprintf(stderr,"line:%d",__LINE__);
75 perror("sendto");
76 return -1;
77
78 }
79 printf("发送成功\n");
80 bzero(buf,sizeof(buf));
81
82 //接收
83 if(recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&rcvaddr,&addrlen)<0)
84 {
85
86
87 fprintf(stderr,"line:%d",__LINE__);
88 perror("recvfrom");
89 return -1;
90
91 }
92 printf("[%s:%d] : %s __%d__\n",inet_ntoa(rcvaddr.sin_addr),\
93 htons(rcvaddr.sin_port),buf,__LINE__);
94
95
96 }
97 //关闭
98 close(cfd);
99 return 0;
100
101 }
~
~
~
~
~
~
~
~
~
~
~
现象
TCP服务器
1 #include <stdio.h>
2 #include <myhead.h>
3
4 #define PORT 9999 //1024~49151
5 #define IP "192.168.124.17"//ifconfig查找本机的IP地址
6
7
8
9 int main(int argc, const char *argv[])
10 {
11
12 //创建流式套接字文件
13
14 int sfd = socket(AF_INET,SOCK_STREAM,0);
15 if(sfd <0)
16 {
17 fprintf(stderr,"line:%d",__LINE__);
18 perror("socket");
19 return -1;
20 }
21 printf("创建流式套接字文件成功 sfd=%d __%d__\n",sfd,__LINE__);
22
23 //允许端口号被快速重复使用
24 int reuse = 1;
25 if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0)
26 {
27 fprintf(stderr,"line:%d",__LINE__);
28 perror("setsockopt");
29 return -1;
30
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);//端口号的网络字节序
38 sin.sin_addr.s_addr = inet_addr(IP);
39 //绑定服务器自身的地址信息--》必须绑定
40 if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0)
41 {
42 fprintf(stderr,"line:%d",__LINE__);
43 perror("bind");
44 return -1;
45 }
46 printf("bind success __%d__\n",__LINE__);
47 //将套接字设置为被动监听状态
48 if(listen(sfd,128)<0)
49 {
50 fprintf(stderr,"line:%d",__LINE__);
51 perror("listen");
52 return -1;
53 }
54 printf("listen success __%d__\n",__LINE__);
55
56 struct sockaddr_in cin;//存储客服端信息的
57 socklen_t addrlen = sizeof(cin);
58 //会从已完成连接队列的对头获取一个客户端的信息,生成一个新的文件描述符
59 //accept(sfd,NULL,NULL);
60 int newfd = accept(sfd,(struct sockaddr*)&cin,&addrlen);
61 if(newfd <0)
62 {
63 fprintf(stderr,"line:%d",__LINE__);
64 perror("accept");
65 return -1;
66 }
67
68 printf("[%s:%d] 客服端连接成功 newfd=%d __%d__\n",\
69 inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd,__LINE__);
70 char buf[128];
71 ssize_t res;
72 while(1)
73 {
74 bzero(buf,sizeof(buf));
75
76 //接收
77 res = recv(newfd,buf,sizeof(buf),0);
78 if(res<0)
79 {
80
81
82 fprintf(stderr,"line:%d",__LINE__);
83 perror("recv");
84 return -1;
85 }
86 else if(0==res)
87 {
88 printf("客服端下线 __%d__",__LINE__);
89 break;
90 }
91 printf("[%s:%d] 客服端连接成功 newfd=%d __%d__\n",\
92 inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd,__LINE__);
93
94
95
96 //发送
97 strcat(buf,"*~*");
98 if( send(newfd,buf,sizeof(buf),0)<0)
99 {
100 fprintf(stderr,"line:%d",__LINE__);
101 perror("send");
102 return -1;
103
104 }
105 printf("send success __%d__",__LINE__);
106
107 }
108
109
110
111 //关闭文件描述符
112
113 close(newfd);
114 close(sfd);
115 return 0;
116 }
~
~
~
TCP客户端
1 #include <stdio.h>
2 #include <myhead.h>
3
4 #define CLI_PORT 7777 //1024~49151
5 #define CLI_IP "192.168.124.17"//ifconfig查找本机的IP地址
6
7
8
9 int main(int argc, const char *argv[])
10 {
11 if(argc <3)
12 {
13 printf("请在命令行传入服务器的port和ip\n");
14 return -1;
15 }
16
17 //创建流式套接字
18
19 int cfd = socket(AF_INET,SOCK_STREAM,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 //若不绑定,则操作系统会自动给客服端绑定客服端所运行主机的IP及随机端口:
29 //49152~65535
30 ///以下绑定客服端的地址,可以不写
31
32 //允许端口号被快速重复使用
33 int reuse = 1;
34 if(setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0)
35 {
36 fprintf(stderr,"line:%d",__LINE__);
37 perror("setsockopt");
38 return -1;
39
40 }
41
42
43 //填充客服端的地址信息结构体,给bind函数绑定使用
44 //真实的地址信息结构体根据地址族制定
45 //AF_INET --->man 7 ip
46 struct sockaddr_in cin;
47 cin.sin_family = AF_INET;//必须填AF_INET;
48 cin.sin_port = htons(CLI_PORT);//客服端要绑定的端口号
49 cin.sin_addr.s_addr = inet_addr(CLI_IP);//客服端绑定的IP地址
50
51 if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))<0)
52 {
53 fprintf(stderr,"line:%d",__LINE__);
54 perror("bind");
55 return -1;
56 }
57 printf("客服端绑定[%s:%d]成功 __%d__\n",CLI_IP,CLI_PORT,__LINE__);
58
59 /
60 //填充服务器的地址信息,给connect函数连接服务器的时候使用
61 struct sockaddr_in sin;
62 sin.sin_family = AF_INET;//必须填AF_INET;
63 sin.sin_port = htons(atoi(argv[1]));//服务器要绑定的端口号
64 sin.sin_addr.s_addr = inet_addr(argv[2]);//服务器绑定的IP地址
65 //连接指定的服务器
66 if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))<0)
67 {
68 fprintf(stderr,"line:%d",__LINE__);
69 perror("connect");
70 return -1;
71 }
72 printf("connect server[%s:%s] 成功 __%d__\n",argv[2],argv[1],__LINE__);
73
74 char buf[128]= "";
75 ssize_t res;
76 while(1)
77 {
78 printf("请输入数据>>>");
79 fgets(buf,sizeof(buf),stdin);
80 buf[strlen(buf)-1]='\0';
81
82 //发送
83 strcat(buf,"*_*");
84 if( send(cfd,buf,sizeof(buf),0)<0)
85 {
86 fprintf(stderr,"line:%d",__LINE__);
87 perror("send");
88 return -1;
89
90 }
91 printf("send success __%d__",__LINE__);
92
93
94
95 //接收
96 bzero(buf,sizeof(buf));
97
98
99 res = recv(cfd,buf,sizeof(buf),0);
100 if(res<0)
101 {
102
103
104 fprintf(stderr,"line:%d",__LINE__);
105 perror("recv");
106 return -1;
107 }
108 else if(0==res)
109 {
110 printf("服务器下线 __%d__",__LINE__);
111 break;
112 }
113 printf(":%s __%d__\n",buf,__LINE__);
114
115 }
116
117
118
119 //关闭文件描述符
120 close(cfd);
121 return 0;
122 }
~
~
~
~
~
现象
机械臂
1 #include <stdio.h>
2 #include <myhead.h>
3
4 #define CLI_PORT 7777 //1024~49151
5 #define CLI_IP "192.168.124.17"//ifconfig查找本机的IP地址
6
7
8
9 int main(int argc, const char *argv[])
10 {
11 if(argc <3)
12 {
13 printf("请在命令行传入服务器的port和ip\n");
14 return -1;
15 }
16
17 //创建流式套接字
18
19 int cfd = socket(AF_INET,SOCK_STREAM,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 struct sockaddr_in sin;
29 sin.sin_family = AF_INET;//必须填AF_INET;
30 sin.sin_port = htons(atoi(argv[1]));//服务器要绑定的端口号
31 sin.sin_addr.s_addr = inet_addr(argv[2]);//服务器绑定的IP地址
32 //连接指定的服务器
33 if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))<0)
34 {
35 fprintf(stderr,"line:%d",__LINE__);
36 perror("connect");
37 return -1;
38 }
39 printf("connect server[%s:%s] 成功 __%d__\n",argv[2],argv[1],__LINE__);
40
41 int fd = open("/dev/input/event1",O_RDONLY);
42 if(fd < 0)
43 {
44 perror("open");
45 return -1;
46 }
47 struct input_event ev;
48 char buf[5] = {0xff,0x02,0x00,45,0xff};
49 unsigned char str[5] = {0xff,0x02,0x01,45,0xff};
50 if( send(cfd,buf,sizeof(buf),0)<0)
51 {
52 fprintf(stderr,"line:%d",__LINE__);
53 perror("send");
54 return -1;
55
56 }
57 printf("send success __%d__",__LINE__);
58 if( send(cfd,str,sizeof(str),0)<0)
59 {
60 fprintf(stderr,"line:%d",__LINE__);
61 perror("send");
62 return -1;
63
64 }
65 printf("send success __%d__",__LINE__);
66
67 char c;
68 while(1)
69 {
70 if(read(fd,&ev,sizeof(ev))<0)
71 {
72 perror("read");
73 return -1;
74
75
76 }
77 switch(ev.code*ev.value)
78 {
79 case 17:
80 buf[3]+=5;
81 if(buf[3]>90)
82 buf[3] = 90;
83 break;
84 case 31:
85 buf[3]-=5;
86 if(buf[3]<-90)
87 buf[3]=-90;
88 break;
89 case 30:
90 str[3]-=5;
91 if(str[3]<0)
92 str[3] = 0 ;
93
94 break;
95
96 case 32:
97 str[3]+=5;
98 if(str[3]>180)
99 str[3] = 180;
100 break;
101 default:
102 continue;
103 }
104 if( send(cfd,buf,sizeof(buf),0)<0)
105 {
106 fprintf(stderr,"line:%d",__LINE__);
107 perror("send");
108 return -1;
109
110 }
111 printf("send success __%d__",__LINE__);
112 if( send(cfd,str,sizeof(str),0)<0)
113 {
114 fprintf(stderr,"line:%d",__LINE__);
115 perror("send");
116 return -1;
117
118 }
119 printf("send success __%d__",__LINE__);
120
121
122
123 }
124
125
126
127 //关闭文件描述符
128 close(cfd);
129 return 0;
130 }