UDP 无法接收包,似乎阻塞了.小弟新手,跪求,多谢大家.

UDP 无法接收包,似乎阻塞了...小弟新手,跪求各位大哥,在线等!谢谢大家...
int recv;
SOCKADDR_IN addrSend; 
int len = sizeof(SOCKADDR_IN); 
SOCKET RecvSocket; 
struct sockaddr_in RecvAddr; 

InitWinsock();
RecvSocket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); 

RecvAddr.sin_family = AF_INET;  
RecvAddr.sin_port = htons(7778);  
RecvAddr.sin_addr.S_un.S_addr =htonl(INADDR_ANY);

//在此设置非阻塞
//unsigned long iMode = 1;//为0时阻塞,非0时不阻塞
//::ioctlsocket(RecvSocket,FIONBIO,&iMode);

bind(RecvSocket,(LPSOCKADDR)&RecvAddr,sizeof(SOCKADDR_IN));

char recvBuf[1024];
SOCKADDR_IN addrClient;  
while(1)
{
pthread_mutex_lock(&mut);
recv = recvfrom(RecvSocket,recvBuf,1024,0,(LPSOCKADDR)&addrSend,&len);  
printf("Recvfrom failed:%d\n", WSAGetLastError());
pthread_mutex_unlock(&mut);
Sleep(1000);

}
closesocket(RecvSocket);

这是一段在main中新开的一个线程的函数中的代码,我能发送数据,但这段接受数据报的代码在recvfrom处好像阻塞,在服务器端调试发现数据确实有发送出来。。。 求救啊, ps. 另外我发送数据一切正常



------解决方案--------------------
这样?
windows机器是否开了防火墙?


1个socket很好处理啊

简单的做法

server:
while(run){
用select判断有无read,需设置超时。比如1秒(也可以用nonblock直接读)

有read数据,调用recvfrom 然后更新clientAddr.

检查是否有数据需发送给客户端clientaddr。是则发送。
}


client:

发送请求
while(run){
接收数据。
}



更可靠的方法需要制造一个通讯协议,比如client发送请求后,需要定时告诉server他还活着。

这样当客户端退出后,server可以通过超时知道现在没有客户端,从而停止发送。