此段程序中,recvfrom为何不能自动阻塞?
SOCKET recvSock;
sockaddr_in recvAddr;
sockaddr_in senderAddr;
int senderAddrSize = sizeof(senderAddr);
recvSock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
recvAddr.sin_family = AF_INET;
recvAddr.sin_port = htons(UNILATERALPUNCHINGSERVER_PORT);
recvAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); bind(recvSock,(sockaddr*)&recvAddr,sizeof(recvAddr)); //绑定服务器监听端口 stP2PMessage recvBuffP2P; //定义接收消息的缓冲区
ZeroMemory(&recvBuffP2P,sizeof(recvBuffP2P));
while(true)
{
//接收来自客户端的消息,并存放在缓冲区recvBuff中
int iread = recvfrom(recvSock,(char*)&recvBuffP2P,
sizeof(recvBuffP2P),0,
(sockaddr*)&senderAddr,
&senderAddrSize);
if(iread>0)
{
stUserNode *current = new stUserNode;
current = clientList.Search(recvBuffP2P.userName); //查找'目的用户'的用户结点
……
SOCKET recvSock;
sockaddr_in recvAddr;
sockaddr_in senderAddr;
int senderAddrSize = sizeof(senderAddr);
recvSock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
recvAddr.sin_family = AF_INET;
recvAddr.sin_port = htons(UNILATERALPUNCHINGSERVER_PORT);
recvAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); bind(recvSock,(sockaddr*)&recvAddr,sizeof(recvAddr)); //绑定服务器监听端口 stP2PMessage recvBuffP2P; //定义接收消息的缓冲区
ZeroMemory(&recvBuffP2P,sizeof(recvBuffP2P));
while(true)
{
//接收来自客户端的消息,并存放在缓冲区recvBuff中
int iread = recvfrom(recvSock,(char*)&recvBuffP2P,
sizeof(recvBuffP2P),0,
(sockaddr*)&senderAddr,
&senderAddrSize);
if(iread>0)
{
stUserNode *current = new stUserNode;
current = clientList.Search(recvBuffP2P.userName); //查找'目的用户'的用户结点
……
socket定义时,默认是阻塞模式得,要设置为非阻塞模式,可以在定义socket得时候:
//设置为非阻塞模式
unsigned long cmd;
int nStatus;
nStatus=ioctlsocket(g_cTranPeerA.m_sLocalSocket,FIONBIO,&cmd);
if(nStatus==SOCKET_ERROR)
{
AfxMessageBox("Set block model failed!");
}
继续往下执行对不对?
我也碰到过这个问题
加个Sleep试试看