很奇怪,本来好好的还能接到数据,但我在舒适化里多加了个SOCKET后原来那个就不阻塞了,我加了
while(SOCKET_ERROR==recvfrom(sockClient_R,recvBuf,1440,0,(SOCKADDR*)&addrSrv_S,&len))
{
}
却也怎么也接受不到数据了,一直不阻塞,怪了!很疑惑,用多个SOCKET端口的话,不加select或其他I/O模型不行吗?I/O模型只是防止阻塞函数在条件为满足的时候阻塞而是程序挂起。
while(SOCKET_ERROR==recvfrom(sockClient_R,recvBuf,1440,0,(SOCKADDR*)&addrSrv_S,&len))
{
}
却也怎么也接受不到数据了,一直不阻塞,怪了!很疑惑,用多个SOCKET端口的话,不加select或其他I/O模型不行吗?I/O模型只是防止阻塞函数在条件为满足的时候阻塞而是程序挂起。
{
}服务地址只有一个,单线程的话,你这里仅仅是在等待一个端口的数据而已啊。
// UINT IOC_IN = 0x80000000;
// UINT IOC_VENDOR = 0x18000000;
UINT nConnReset = IOC_IN | IOC_VENDOR | 12;
BOOL bNewBehavior = FALSE;
DWORD dwBytesReturned = 0;
return SOCKET_ERROR != ::WSAIoctl(nSock,nConnReset,&bNewBehavior,sizeof(bNewBehavior),NULL,0,&dwBytesReturned, NULL, NULL);
试试看吧。
{
}
{
len=sizeof(SOCKADDR);
return(sendto(sockSrv_S,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrClient_R,len));
}void Socket::Socket_reveive()
{
len=sizeof(SOCKADDR);
recvfrom(sockSrv_R,recvBuf,1500,0,(SOCKADDR*)&addrClient_S,&len);
}
--------------
???
addrClient_R.sin_addr.S_un.S_addr=inet_addr("192.168.1.227");
addrClient_R.sin_family=AF_INET;
addrClient_R.sin_port=htons(3000);
sendto(sockSrv_S, "Test", 5, 0, (struct sockaddr*)&addrClient_R, &len);
这个好像不麻烦 你在启动recvfrom之前 设置好IP信息后 用sendto 随便发送一些东西出去 UDP协议就是这样 可能需要预先建立一条UDP内核记录吧
回14楼,UDP不是接受端需要先运行吗?接受端需要先绑定本地的端口号,发送端才能发!
GetLastError()的返回值是10022,怎么回事呢?
to:hmm7e如果recvfrom绑定的端口和sendto发送的端口不是同一个端口,sendto的目标地址不存在recvfrom还是收到一个错误消息吗?
之所以这么问,是因为有次在自己的程序中每按一个按钮sendto一次,recvfrom就会莫名的返回一个SOCKET_ERROR,一直不明白这是怎么回事!
你说的“错误信息”应该是不是函数返回错误,而是收到一个类似于“目标不可到达”的数据包吧?