您现在的位置是:首页 > 技术文章网站首页技术文章
[C++]Windows UDP 通信
了解 Windows 下UDP 通信
Server 服务端
#include<winsock2.h> #include<stdio.h> #include<string.h> #include<iostream> using namespace std; #pragma comment(lib,"ws2_32.lib") #define BUFFER_SIZE 1024 int main(){ WSADATA WSAData; char receBuf[BUFFER_SIZE]; char Response[]=""; if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0){ printf("初始化失败"); exit(1); } SOCKET sockServer=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); if(sockServer == INVALID_SOCKET) { printf("Failed socket() \n"); return 0; } SOCKADDR_IN addr_Server; //服务器的地址等信息 addr_Server.sin_family=AF_INET; addr_Server.sin_port=htons(8888); addr_Server.sin_addr.S_un.S_addr=INADDR_ANY; if(bind(sockServer,(SOCKADDR*)&addr_Server,sizeof(addr_Server))==SOCKET_ERROR ){//服务器与本地地址绑定 printf("Failed socket() %d \n", WSAGetLastError()); return 0; } SOCKADDR_IN addr_Clt; int fromlen = sizeof(SOCKADDR); while(true){ int last= recvfrom(sockServer, receBuf, 1024, 0, (SOCKADDR*) &addr_Clt, &fromlen); if(last>0){ //判断接收到的数据是否为空 receBuf[last]='\0';//给字符数组加一个'\0',表示结束了。不然输出有乱码 if(strcmp(receBuf,"bye")==0){ cout<<" 客户端不跟我聊天了..."<<endl; closesocket(sockServer); return 0; }else{ printf("接收到数据(%s):%s\n", inet_ntoa(addr_Clt.sin_addr), receBuf); } } cout<<"回复客户端消息:"; cin>>Response; //给客户端回复消息 sendto(sockServer,Response, strlen(Response), 0, (SOCKADDR*)&addr_Clt, sizeof(SOCKADDR)); } closesocket(sockServer); WSACleanup(); return 0; }
Client 客户端
#include<winsock2.h> #include<stdio.h> #include<string.h> #include<iostream> using namespace std; #pragma comment(lib,"ws2_32.lib") # define BUFFER_SIZE 1024 //缓冲区大小 int main() { SOCKET sock_Client; //客户端用于通信的Socket WSADATA WSAData; char receBuf[BUFFER_SIZE]; //发送数据的缓冲区 char sendBuf[BUFFER_SIZE]; //接受数据的缓冲区 if (WSAStartup(MAKEWORD(2, 2), &WSAData) != 0) { printf("初始化失败!"); return -1; } //初始化 sock_Client = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);//创建客户端用于通信的Socket SOCKADDR_IN addr_server; //服务器的地址数据结构 addr_server.sin_family = AF_INET; addr_server.sin_port = htons(8888);//端口号为8888 addr_server.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //127.0.0.1为本电脑IP地址 SOCKADDR_IN sock; int len = sizeof(sock); while (true) { cout << "请输入要传送的数据:"; cin >> sendBuf; sendto(sock_Client, sendBuf, strlen(sendBuf), 0, (SOCKADDR*)&addr_server, sizeof(SOCKADDR)); //int last=recv(sock_Client, receBuf, strlen(receBuf), 0); // (调用recv和recvfrom都可以) int last = recvfrom(sock_Client, receBuf, strlen(receBuf), 0, (SOCKADDR*)&sock, &len); if (last > 0) { receBuf[last] = '\0'; //给字符数组加一个'\0',表示结束了。不然输出有乱码 if (strcmp(receBuf, "bye") == 0) { cout << "服务器不跟我聊天了..." << endl;//当服务器发来bye时,关闭socket closesocket(sock_Client); break; } else { printf("接收到数据:%s\n", receBuf); } } } closesocket(sock_Client); WSACleanup(); return 0; }
上一篇:[QMake]命令行参数
下一篇:[Qt]UDP客户端详解
相关文章
- [Qt]UDP客户端详解
- [C++]Windows UDP 通信
- TCP协议和UDP协议的特点和区别
- UDP 循环服务器
- [C++]数据封装
- [C++]多态
- [C++]实现链表反转逆序
- [C/C++]经典算法 二(面试题)
- [C/C++]数组、指针 & 引用
- [C++]内存管理机制
- [C/C++]经典算法 一(面试题)
- [CMake]CMake安装
- [C++]信号处理
- [ThinkPHP]Windows 搬 Linux
- 进程间的通信方式
- [C/C++]管道通信
- [Ubuntu] 安装Qt5.15无法启动解决方法
- [Boost]Vs2019编译Boost
- [OBS]Vs2019编译OBS源码
- [OBS]显示器采集黑屏
- [Qt+Vs]FFmpeg音频同步基本实现
- [Vs+Qt]程序打包发布
- [Qt]QML debug: DISABLED
- [Qt]切换皮肤样式
文章评论 (0)