socket创建之后是非阻塞的。
创建socket之后调用recvfrom()没有问题,程序在这个函数的地方等。
可是
创建一个socket之后调用sendto();
然后再调用recvfrom();
这时候就过去了,好像调用了sendto()之后socket就变成非阻塞的了
有什么办法在调用了sendto之后能在马上调用的recvfrom()阻塞
就像这样
PrimaryUDP = socket(AF_INET, SOCK_DGRAM, 0);
sockaddr_in sin;
sin.sin_addr.S_un.S_addr = INADDR_ANY;
sin.sin_family = AF_INET;
sin.sin_port = 0;
if (bind(PrimaryUDP, (struct sockaddr*)&sin, sizeof(sin)) < 0)
{
AfxMessageBox("bind error!");
return;
}
server.sin_addr.S_un.S_addr = inet_addr(IPAddr);
server.sin_family = AF_INET;
server.sin_port = htons(2222);
char buf[256];
int retval = sendto(PrimaryUDP,buf,256,0,(const sockaddr*)&server,sizeof(server));
retval = recvfrom(PrimaryUDP,(char *)recvbuf,256,0,(sockaddr*)&server,&dwServer);
//在最后一行等待直道收到数据才返回。
创建socket之后调用recvfrom()没有问题,程序在这个函数的地方等。
可是
创建一个socket之后调用sendto();
然后再调用recvfrom();
这时候就过去了,好像调用了sendto()之后socket就变成非阻塞的了
有什么办法在调用了sendto之后能在马上调用的recvfrom()阻塞
就像这样
PrimaryUDP = socket(AF_INET, SOCK_DGRAM, 0);
sockaddr_in sin;
sin.sin_addr.S_un.S_addr = INADDR_ANY;
sin.sin_family = AF_INET;
sin.sin_port = 0;
if (bind(PrimaryUDP, (struct sockaddr*)&sin, sizeof(sin)) < 0)
{
AfxMessageBox("bind error!");
return;
}
server.sin_addr.S_un.S_addr = inet_addr(IPAddr);
server.sin_family = AF_INET;
server.sin_port = htons(2222);
char buf[256];
int retval = sendto(PrimaryUDP,buf,256,0,(const sockaddr*)&server,sizeof(server));
retval = recvfrom(PrimaryUDP,(char *)recvbuf,256,0,(sockaddr*)&server,&dwServer);
//在最后一行等待直道收到数据才返回。
用WSAAsyncSelect可以在阻塞和非阻塞之间切换。
--------------
不对吧
//设置非阻塞方式连接
unsigned long ul = 1;
ret = ioctlsocket(cClient, FIONBIO, (unsigned long*)&ul);
if(ret==SOCKET_ERROR)return 0;