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);
//在最后一行等待直道收到数据才返回。

解决方案 »

  1.   

    没有太明白你的意思,是不是想调用sendto时采用非阻塞方式,而调用recvfrom时采用阻塞方式?
    用WSAAsyncSelect可以在阻塞和非阻塞之间切换。
      

  2.   

    socket创建之后是非阻塞的。
    --------------
    不对吧
      

  3.   

    调用sendto()之后
    //设置非阻塞方式连接
    unsigned long ul = 1;
    ret = ioctlsocket(cClient, FIONBIO, (unsigned long*)&ul);
    if(ret==SOCKET_ERROR)return 0;
      

  4.   

    用select模型,方便控制. 阻塞的恐怕会一个调用一去不回啊
      

  5.   

    sendto后,改变一下server的参数试一下。你recvfrom的地址是sendto的目的地址。就是说你接收到自己发的数据了!