1、 在其他线程里调用closesocket(),接收线程里会的recvfrom会返回10004错误,如果继续recvfrom会返回10038错误,通过检测这两个错误来进行退出
2、 在其他线程里给接收线程sendto一个特殊包,通过检测这个包判断是否需要退出
3、 使用传说中的select模型
4、UDPServer.cpp#include<WINSOCK2.H>挢旗扦渌;#include<iostream&爿讥旌护gt;#pragma comment(lib,"WS2_32.lib")using namespace std;int main(){WSADATA wsaData;//初始化SOCKET SendSocket;sockaddr_in RecvAddr;//服务器地址int Port=4000;//服务器监听地址char SendBuf[1024];//发送数据的缓冲区int BufLen=1024;//缓冲区大小//初始化SocketWSAStartup(MAKEWORD(2,2),&wsaData);//创建Socket对象SendSocket=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);//设置服务器地址RecvAddr.sin_family=AF_INET;RecvAddr.sin_port=htons(Port);RecvAddr.sin_addr.s_addr=inet_addr("192.168.137.1");//向服务器发送数据报printf("Sending a datagram to the receiver...\n");sendto(SendSocket,SendBuf,BufLen,0,(SOCKADDR *)&RecvAddr,sizeof(RecvAddr));//发送完成,关闭Socketprintf("finished sending,close socket.\n");closesocket(SendSocket);printf("Exting.\n");WSACleanup();return 0;}UDPClient.cpp#include<WINSOCK2.H>#include<iostream>#pragma comment(lib,"WS2_32.lib")using namespace std;int main(){WSADATA wsaData;//初始化SOCKET RecvSocket;sockaddr_in RecvAddr;//服务器地址int Port=4000;//服务器监听地址char RecvBuf[1024];//发送数据的缓冲区int BufLen=1024;//缓冲区大小sockaddr_in SenderAddr;int SenderAddrSize=sizeof(SenderAddr);//初始化SocketWSAStartup(MAKEWORD(2,2),&wsaData);//创建接收数据报的socketRecvSocket=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);//将socket与制定端口和0.0.0.0绑定RecvAddr.sin_family=AF_INET;RecvAddr.sin_port=htons(Port);RecvAddr.sin_addr.s_addr=htonl(INADDR_ANY);bind(RecvSocket,(SOCKADDR *)&RecvAddr,sizeof(RecvAddr));//调用Recvfrom函数在绑定的socket上接收数据printf("receiving datagrams...\n");recvfrom(RecvSocket,RecvBuf,BufLen,0,(SOCKADDR *)&SenderAddr,&SenderAddrSize);//关闭socket,结束接收数据printf("finished receiving,closing socket..\n");closesocket(RecvSocket);//释放资源,退出printf("Exiting.\n");WSACleanup();return 0;}