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可以通过超时知道现在没有客户端,从而停止发送。
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可以通过超时知道现在没有客户端,从而停止发送。