本帖最后由 ぉ沙皮狗的忧伤 于 2021-3-11 17:35 编辑
一、sever端代码编写
代码编写流程
①、添加头文件
②、创建数字报套接字
③、绑定本地IP和地址端口
④、读数据
1、添加头文件
- //添加头文件
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <strings.h>
- #include <unistd.h>
-
- #include <arpa/inet.h>
- #include <sys/types.h>
- #include <sys/socket.h>
-
- #include <netinet/in.h>
- #include <netinet/ip.h>
复制代码
2、创建数字报套接字
- //创建数字报套接字
- //参数1----地址协议族,AF_INET网络协议族
- //参数2----套接字类型,SOCK_DGRAM使用UDP协议
- //参数3----protocol参数通常设置为0
- //返回值---成功返回socket id,失败返回-1
- serfd = socket( AF_INET, SOCK_DGRAM, 0);
- if(serfd < 0){
- perror("socket failed!\n");
- exit(1);
- }
复制代码
3、绑定本地IP和地址端口
- //绑定本地IP和指定端口
- struct sockaddr_in self;
- bzero( &self, sizeof(self));
-
- self.sin_family = AF_INET; //网络协议族
- self.sin_port = htons(9999); //要连接的服务器端口
- self.sin_addr.s_addr = htonl(INADDR_ANY); //内核自动绑定本地所有的IP
-
- ret = bind( serfd, (struct sockaddr *)&self, sizeof(self));
- if(ret < 0){
- perror("bind failed!\n");
- exit(1);
- }
复制代码
4、读数据
UDP是不可靠的无连接的协议,在数据发送前不需要进行连接
- //读数据
- while(1){
- bzero( buf, 1024);
- //接收数据
- //参数1----标识一个已连接的套接字
- //参数2----接收数据缓冲区
- //参数3----缓冲长度
- //参数4----调用操作方式
- //参数5----指向装有源地址的缓冲区
- //参数6----指向from缓冲区长度值
- ret = recvfrom( serfd, buf, 1023, 0, (struct sockaddr *)&cli, &len);
- if(ret < 0){
- perror("recvform failed!\n");
- exit(1);
- }
-
- printf(" client ip = %s port = %d buf:%s\n", inet_ntoa(cli.sin_addr),\
- ntohs(cli.sin_port), buf);
- }
复制代码
二、client端代码编写
client代码编写流程
①、添加头文件
②、建立数据报套接字
③、指定服务器端口和ip地址
④、写数据
1、添加头文件
- //添加头文件
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <strings.h>
-
- #include <arpa/inet.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <netinet/ip.h>
复制代码
2、建立数据报套接字
- //建立数据报套接字
- serfd = socket( AF_INET, SOCK_DGRAM);
- if(serfd < 0){
- perror("socket failed!\n");
- exit(1);
- }
复制代码
3、指定服务器端口和IP
- struct sockaddr_in self;
- bzero( &self, sizeof(self));
-
- self.sin_family = AF_INET;
- self.sin_port = htons(9999);
- self.sin_addr.s_addr = inet_addr("172.18.21.163");
复制代码
4、通过fgets获取标准输入中键盘的数据,输入serfd套接字中,通过udp发送给服务器
- //写数据
- while(1){
- bzero( buf, 128);
- fgets( buf, 1218, stdin);
-
- //用来将数据由指定的socket传给对方主机
- //参数1-----已经连接的套接字
- //参数2-----传递的数据
- //参数3-----数据长度
- //参数4-----标志位,一般设置0
- //参数5-----服务器的端口及ip
- //参数6-----sockaddr结构体的大小
- //返回值----成功返回实际传递出去的字符数,失败返回-1
- ret = sendto( serfd, buf, strlen(buf), 0, (struct sockaddr *)&self, sizeof(self));
- if(ret < 0){
- perror("sendto failed!\n");
- exit(1);
- }
- }
复制代码
三、编译代码使用gcc编译sever代码,使用交叉编译工具编译client代码
先执行sever端代码。然后在板卡上执行client代码
代码在附件中
|