问题描述
//客户端#include"stdafx.h"#include<winsock2.h>#include<iostream>#include<cstdlib>#pragmacomment(lib,"WS2_32")//链接到WS2_32.lib#defineBUFFERLEN256usingnamespacestd;classCInitSock{public:CInitSock(BYTEminorVer=2,BYTEmajorVer=2){//初始化WS2_32.dllWSADATAwsaData;WORDsockVersion=MAKEWORD(minorVer,majorVer);if(::WSAStartup(sockVersion,&wsaData)!=0){exit(0);}}~CInitSock(){::WSACleanup();}};DWORDWINAPISendProc(LPVOIDlparam);DWORDWINAPIRecvProc(LPVOIDlparam);DWORDWINAPIListenProc(LPVOIDlparam);HANDLEh[2]={0};sockaddr_into={0};inttoLen=sizeof(to);intmain(){CInitSockclientInit;SOCKETsClientSocket=socket(AF_INET,SOCK_DGRAM,0);to.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");to.sin_family=AF_INET;to.sin_port=htons(8080);HANDLEh[2];h[0]=CreateThread(NULL,0,SendProc,(LPVOID)sClientSocket,0,NULL);h[1]=CreateThread(NULL,0,RecvProc,(LPVOID)sClientSocket,0,NULL);WaitForMultipleObjects(1,h,TRUE,INFINITE);closesocket(sClientSocket);system("pause");return0;}DWORDWINAPISendProc(LPVOIDlparam){charsendBuffer[BUFFERLEN];charrecvBuffer[BUFFERLEN];SOCKETs=SOCKET(lparam);memset(sendBuffer,0,BUFFERLEN);memset(recvBuffer,0,BUFFERLEN);while(1){cin>>sendBuffer;intret=sendto(s,sendBuffer,strlen(sendBuffer),0,(constsockaddr*)&to,toLen);recvfrom(s,recvBuffer,BUFFERLEN,0,(sockaddr*)&to,&toLen);if(ret<=0)break;if(strcmp(sendBuffer,"quit")==0)break;}return0;}DWORDWINAPIRecvProc(LPVOIDlparam){SOCKETs=(SOCKET)lparam;sockaddr_inlocal;charrecvBuffer[BUFFERLEN];intlen=sizeof(local);while(1){getsockname(s,(sockaddr*)&local,&len);if(local.sin_port==0){Sleep(1000);continue;}ZeroMemory(recvBuffer,BUFFERLEN);intret=recvfrom(s,recvBuffer,BUFFERLEN,0,(sockaddr*)&to,&toLen);if(ret<=0)break;cout<<"from"<<inet_ntoa(to.sin_addr)<<":"<<ntohs(to.sin_port)<<":"<<ret<<"长度,"<<recvBuffer<<endl;if(strcmp(recvBuffer,"quit")==0)break;}return0;}//服务器//UDP-server.cpp:定义控制台应用程序的入口点。//#include"stdafx.h"#include<winsock2.h>#include<iostream>#include<cstdlib>#pragmacomment(lib,"WS2_32")//链接到WS2_32.lib#defineBUFFERLEN256usingnamespacestd;classCInitSock{public:CInitSock(BYTEminorVer=2,BYTEmajorVer=2){//初始化WS2_32.dllWSADATAwsaData;WORDsockVersion=MAKEWORD(minorVer,majorVer);if(::WSAStartup(sockVersion,&wsaData)!=0){exit(0);}}~CInitSock(){::WSACleanup();}};DWORDWINAPISendProc(LPVOIDlparam);DWORDWINAPIRecvProc(LPVOIDlparam);DWORDWINAPIListenProc(LPVOIDlparam);sockaddr_infrom={0};intfromLen=sizeof(from);HANDLEh[2]={0};intmain(){CInitSockserverinit;SOCKETsServerSocket=socket(AF_INET,SOCK_DGRAM,0);sockaddr_insin;intlen=sizeof(sin);ZeroMemory(&sin,sizeof(sin));sin.sin_port=htons(8080);sin.sin_family=AF_INET;sin.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");bind(sServerSocket,(constsockaddr*)&sin,len);HANDLEh[2];h[0]=CreateThread(NULL,0,SendProc,(LPVOID)sServerSocket,0,NULL);h[1]=CreateThread(NULL,0,RecvProc,(LPVOID)sServerSocket,0,NULL);WaitForMultipleObjects(1,h,TRUE,INFINITE);closesocket(sServerSocket);system("pause");return0;}DWORDWINAPISendProc(LPVOIDlparam){charsendBuffer[BUFFERLEN];SOCKETs=SOCKET(lparam);while(1){cin>>sendBuffer;if(from.sin_addr.S_un.S_addr==0){cout<<"还没有会话方"<<endl;continue;}intret=sendto(s,sendBuffer,strlen(sendBuffer),0,(constsockaddr*)&from,fromLen);if(ret<=0)break;if(strcmp(sendBuffer,"quit")==0)break;}return0;}DWORDWINAPIRecvProc(LPVOIDlparam){SOCKETs=(SOCKET)lparam;charrecvBuffer[BUFFERLEN];charsendBuffer[BUFFERLEN];while(1){memset(recvBuffer,0,BUFFERLEN);memset(sendBuffer,0,BUFFERLEN);intret=recvfrom(s,recvBuffer,BUFFERLEN,0,(sockaddr*)&from,&fromLen);sendto(s,sendBuffer,strlen(sendBuffer),0,(constsockaddr*)&from,fromLen);if(ret<=0)break;cout<<"from"<<inet_ntoa(from.sin_addr)<<":"<<ntohs(from.sin_port)<<":"<<ret<<"长度,"<<recvBuffer<<endl;if(strcmp(recvBuffer,"quit")==0)break;}return0;}
解决方案
解决方案二:
在同一内网?
解决方案三:
这不是C/C++代码吗?。。而且代码还没有格式化我也没有在你的代码里面看到你有给你的客户端发送什么。。。。
解决方案四:
可以借助抓包工具先确认server已经向client发出了数据
解决方案五:
我在客户端和服务器端都创建了两个线程,分别用来接收和发送,服务器接收和发送都没问题,但客户端发送消息后,服务器能收到,就是接收不到服务器发来的数据。在服务器检测发送数据成功,不知道为什么。