通信的方式很简单只是在特殊条件下要求客户端设置通信端口时要设置其端口,网上很少有提及udp客户端通信端口的
在接收数据时,int recvfrom(
SOCKET s,
char* buf,
int len,
int flags,
struct sockaddr* from,
int* fromlen
);
返回值为-1,此时可能是因为接收的len太小不能将缓冲区的数据全部接收。换言之,必须将数据缓冲区的数据一次全部接收,不能按字节接收。
产生错误时用WSAGetLastError分析错误的原因。
int Error;
WORD VersionRequested;
WSADATA WsaData;
VersionRequested=MAKEWORD(2,2);
Error=WSAStartup(VersionRequested,&WsaData); //启动WinSock2
if(Error!=0)
{
return FALSE;
}
else
{
if(LOBYTE(WsaData.wVersion)!=2||HIBYTE(WsaData.wHighVersion)!=2)
{
WSACleanup();
return FALSE;
}
}
//struct sockaddr_in server;
int len =sizeof(server);
server.sin_family=AF_INET;
server.sin_port=htons(nPort); ///server的监听端口
server.sin_addr.s_addr=inet_addr(IP_Str); ///server的地址
client.sin_addr.s_addr = htonl(INADDR_ANY);
client.sin_family =AF_INET;
client.sin_port =htons(LocPort);//设置本地客户端的端口
UDP_Socket=socket(AF_INET,SOCK_DGRAM,0);
bind(UDP_Socket,(struct sockaddr *)&client,sizeof(client));
int RecvTimeout =1000; //设置超时接收属性
setsockopt(UDP_Socket, SOL_SOCKET, SO_RCVTIMEO, (char*)&RecvTimeout, sizeof(RecvTimeout));