96.udp通信
Posted 喵小喵~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了96.udp通信相关的知识,希望对你有一定的参考价值。
运行截图
客户端
- 创建客户端套接字,用于创建UDP通信
1 SOCKET socket_client;
- 创建UDP通信
1 socket_client = socket(AF_INET, SOCK_DGRAM, 0);
- 创建客户端结构体保存ip地址以及端口号
1 SOCKADDR_IN sever;
- 设置通信模式,通信地址以及通信端口
1 //设置通信模式 2 sever.sin_family = AF_INET; 3 //设置通信地址 4 sever.sin_addr.S_un.S_addr = inet_addr("192.168.0.104"); 5 //开启通信端口 6 sever.sin_port = htons(8848);
- 创建字符串用于发送信息
1 //存储获取的字符串 2 char strreceive[1024] = { 0 }; 3 //获取的字符串长度 4 int length;
- 获取字符串并通过套接字发送到相应的ip地址
1 //不断进行数据交换 2 while (1) 3 { 4 char str[1024] = { 0 }; 5 fgets(str, 1024, stdin); 6 //通过套接字发送信息到服务器 7 sendto(socket_client, str, strlen(str) + 1, 0, &sever, sizeof(SOCKADDR)); 8 }
- 套接字检测版本信息
1 //UDP版本,2,2版本 2 WORD wversion=MAKEWORD(2,2); 3 //当前版本 4 WSADATA wsadata; 5 //获取版本对比,开始通信 6 int error = WSAStartup(wversion, &wsadata); 7 8 //如果版本与指定的不对则返回 9 if (error!=0) 10 { 11 printf("error"); 12 return; 13 } 14 15 //取出低八位与高八位进行版本对比 16 if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wVersion) != 2) 17 { 18 printf(" version error"); 19 return; 20 }
- 关闭套接字
1 //关闭 2 closesocket(socket_client); 3 //关闭 4 WSACleanup();
客户端完整代码
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include <stdlib.h> 4 #include <string.h> 5 //网络通信 6 #include<winsock.h> 7 #pragma comment(lib,"ws2_32.lib") 8 9 void main() 10 { 11 //存储获取的字符串 12 char strreceive[1024] = { 0 }; 13 //获取的字符串长度 14 int length; 15 //客户端的套接字,用于创建UDP通信 16 SOCKET socket_client; 17 //创建客户端结构体保存ip地址以及端口号 18 SOCKADDR_IN sever; 19 SOCKADDR_IN severTmp; 20 21 //UDP版本,2,2版本 22 WORD wversion=MAKEWORD(2,2); 23 //当前版本 24 WSADATA wsadata; 25 //获取版本对比,开始通信 26 int error = WSAStartup(wversion, &wsadata); 27 28 //如果版本与指定的不对则返回 29 if (error!=0) 30 { 31 printf("error"); 32 return; 33 } 34 35 //取出低八位与高八位进行版本对比 36 if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wVersion) != 2) 37 { 38 printf(" version error"); 39 return; 40 } 41 //创建UDP通信 42 socket_client = socket(AF_INET, SOCK_DGRAM, 0); 43 44 //设置通信模式 45 sever.sin_family = AF_INET; 46 //设置通信地址 47 sever.sin_addr.S_un.S_addr = inet_addr("192.168.0.104"); 48 //开启通信端口 49 sever.sin_port = htons(8848); 50 51 52 //打开文件 53 FILE *pfr = fopen("1.txt", "rb"); 54 //不断进行数据交换 55 while (1) 56 { 57 char str[1024] = { 0 }; 58 fgets(str, 1024, stdin); 59 //通过套接字发送信息到服务器 60 sendto(socket_client, str, strlen(str) + 1, 0, &sever, sizeof(SOCKADDR)); 61 62 } 63 64 //关闭 65 closesocket(socket_client); 66 //关闭 67 WSACleanup(); 68 69 system("pause"); 70 }
服务器端
- 创建服务器端套接字,用于创建UDP通信
1 //服务器套接字,创建UDP通信 2 SOCKET socket_send;
- 创建UDP通信
1 socket_send = socket(AF_INET, SOCK_DGRAM, 0);
- 创建服务器端结构体保存ip地址以及端口号
1 SOCKADDR_IN server;
- 设置通信模式,通信地址以及通信端口
1 //设置通信方式 2 server.sin_family = AF_INET; 3 //获取本地ip信息 4 server.sin_addr.S_un.S_addr = htonl(INADDR_ANY); 5 server.sin_port = htons(8848);//端口
- 把服务器的ip信息和端口信息与服务器套接字绑定,接收该地址收到的内容
1 bind(socket_send, &server, sizeof(SOCKADDR));
- 保存是谁发来的信息的ip
1 SOCKADDR_IN client;
- 创建字符串用于接收
1 //存储获取的字符串 2 char strreceive[1024] = { 0 }; 3 //存储获取的长度 4 int length;
- 通过套接字获取
1 //获取长度 2 length = sizeof(SOCKADDR); 3 while (1) 4 { 5 //通过服务器套接字接受信息 6 recvfrom(socket_send, strreceive, 1024, 0, &client, &length); 7 if (strlen(strreceive) > 0) 8 { 9 printf("收到%s\\n", strreceive); 10 printf("%d\\n", client.sin_addr.S_un.S_addr); 11 memset(strreceive, 0, 1024); 12 } 13 }
- 版本检测
1 //版本,2,2版本 2 WORD wversion = MAKEWORD(2, 2); 3 //当前版本 4 WSADATA wsadata; 5 //获取版本对比,开始通信 6 int error = WSAStartup(wversion, &wsadata); 7 8 //如果版本与指定的不对则返回 9 if (error != 0) 10 { 11 printf("error"); 12 return; 13 } 14 15 //取出低八位,高八位,对比版本 16 if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wVersion) != 2) 17 { 18 printf(" version error"); 19 return; 20 }
- 关闭
1 closesocket(socket_send);//关闭 2 WSACleanup();
完整代码
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include <stdlib.h> 4 #include <string.h> 5 //网络通信 6 #include<winsock.h> 7 #pragma comment(lib,"ws2_32.lib") 8 9 10 void main() 11 { 12 //存储获取的字符串 13 char strreceive[1024] = { 0 }; 14 //存储获取的长度 15 int length; 16 //服务器套接字,创建UDP通信 17 SOCKET socket_send; 18 //创建服务器端结构体保存ip地址以及端口号 19 SOCKADDR_IN server; 20 //保存是谁发来的信息的ip 21 SOCKADDR_IN client; 22 23 //版本,2,2版本 24 WORD wversion = MAKEWORD(2, 2); 25 //当前版本 26 WSADATA wsadata; 27 //获取版本对比,开始通信 28 int error = WSAStartup(wversion, &wsadata); 29 30 //如果版本与指定的不对则返回 31 if (error != 0) 32 { 33 printf("error"); 34 return; 35 } 36 37 //取出低八位,高八位,对比版本 38 if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wVersion) != 2) 39 { 40 printf(" version error"); 41 return; 42 } 43 44 //创建UDP通信 45 socket_send = socket(AF_INET, SOCK_DGRAM, 0); 46 47 //设置通信方式 48 server.sin_family = AF_INET; 49 //获取本地ip信息 50 server.sin_addr.S_un.S_addr = htonl(INADDR_ANY); 51 server.sin_port = htons(8848);//端口 52 53 //把服务器的ip信息和端口信息与服务器套接字绑定 54 bind(socket_send, &server, sizeof(SOCKADDR)); 55 //获取长度 56 length = sizeof(SOCKADDR); 57 while (1) 58 { 59 //通过服务器套接字接受信息 60 recvfrom(socket_send, strreceive, 1024, 0, &client, &length); 61 if (strlen(strreceive) > 0) 62 { 63 printf("收到%s\\n", strreceive); 64 printf("%d\\n", client.sin_addr.S_un.S_addr); 65 memset(strreceive, 0, 1024); 66 } 67 } 68 69 closesocket(socket_send);//关闭 70 WSACleanup(); 71 72 system("pause"); 73 74 75 }
以上是关于96.udp通信的主要内容,如果未能解决你的问题,请参考以下文章