void CServeDlg::OnButton2() 
{

CAsyncSocket m_sockRecv;
m_sockRecv.Create(5801,SOCK_DGRAM,   FD_CLOSE,"127.0.0.1"); this->m_sockRecv.Bind(5801,"127.0.0.1");

char szRecv[20];
CString szIP("127.0.0.1");
memset(szRecv,'\0',20);
UINT uPort=5800;
int iRecv=m_sockRecv.ReceiveFrom(szRecv,10,szIP,uPort,0); AfxMessageBox("OK!");
}对于CAsyncSocket 类的Create函数中设置的FD_CLOSE,表示没设置的FD_READ.FD_ACCEPT,FD_READ等都是阻塞的。可是:
上面点击Button2后,m_sockRecv.ReceiveFrom()竟然不阻塞,显示AfxMessageBox("OK!");
为什么呢????太困惑,我已经设置FD_READ为阻塞模式

解决方案 »

  1.   

    CAsyncSocket 默认就是异步的
    第三个参数,设置为FD_CLOSE, 表示只关心FD_CLOSE事件,别的事件(接受,读,写)都不关注!!!
    你想阻塞, 用CSocketCSocket m_sockRecv;
    m_sockRecv.Create(5801,SOCK_DGRAM,"127.0.0.1"); 
      

  2.   

    从CAsyncSocket的名字就知道他是异步socket,怎么会阻塞?
      

  3.   


    我在一本书中看到:
    如果希望某个操作时阻塞的,则在调用Create时不要指定该操作对应的网络事件
    例如:希望草Connect和Send是阻塞的,则可以使用如下:

    Socket m_sockRecv;
    m_sockRecv.Create(0,SOCK_STREAM,FD_WRITE|FD_OOB|FD_READ|FD_CLOSE,NULL);这是一本大学教材上的话,我想应该不会错吧??
      

  4.   


    void CServeDlg::OnButton2() 
    { CSocket m_sockRecv; m_sockRecv.Create(5801,SOCK_DGRAM,"127.0.0.1");
    this->m_sockRecv.Bind(5801,"127.0.0.1");
    m_sockRecv.Listen(2);
    char szRecv[20];
    CString szIP("127.0.0.1");
    UINT uPort=5800;
    int iRecv=this->m_sockRecv.ReceiveFrom(szRecv,10,szIP,uPort,0); AfxMessageBox("OK!");
    }
    修改如上后,单击button2后,依然会弹出AfxMessageBox("OK!");
    更迷惑???
      

  5.   

    csocket继续于casyncsocket,所以csocket默认也是异步的,你可以用casyncsocket的IOCtl方法来控制IO模式
      

  6.   

    casyncsocket 本来就是异步的,它要是阻塞了,才怪。
      

  7.   

    这样是不会阻塞的
    那只是把onclose事件关联上而已
    要想阻塞可以用ioctrl等来设这
      

  8.   

    Quote=引用 7 楼 bragi523 的回复:]
    这样是不会阻塞的
    那只是把onclose事件关联上而已
    要想阻塞可以用ioctrl等来设这
    [/Quote]修改如下:
    void CServeDlg::OnButton2() 
    {

    CAsyncSocket m_sockRecv;
    m_sockRecv.Create(5801,SOCK_DGRAM,   FD_CLOSE,"127.0.0.1"); m_sockRecv.Bind(5801,"127.0.0.1");
    m_sockRecv.Listen(2);
    DWORD   arg=0;
    m_sockRecv.IOCtl(FIONBIO,&arg);    char szRecv[20];
    CString szIP("127.0.0.1");

    UINT uPort=5800;
    int iRecv=this->m_sockRecv.ReceiveFrom(szRecv,10,szIP,uPort,0); AfxMessageBox("error");
    }请问如上设置怎还是显示 AfxMessageBox("error");
      

  9.   

    顺序执行到了AfxMessageBox("error"); 
    不显示都难;
      

  10.   


    int iRecv=this->m_sockRecv.ReceiveFrom(szRecv,10,szIP,uPort,0); 这一句中的RecvFrom不是阻塞的吗???
      

  11.   

      
          
    CAsyncSocket m_sockRecv; 
    m_sockRecv.Create(5801,SOCK_DGRAM,  FD_CLOSE,"127.0.0.1"); 
    this->m_sockRecv.Bind(5801,"127.0.0.1"); 

          m_sockRecv.AsyncSelect(0); 
          DWORD  arg=0; 
          m_sockRecv.IOCtl(FIONBIO,&arg);  //
    此3行代码设置为阻塞模式char szRecv[20]; 
    CString szIP("127.0.0.1"); 
    memset(szRecv,'\0',20); 
    UINT uPort=5800; 
    int iRecv=m_sockRecv.ReceiveFrom(szRecv,10,szIP,uPort,0); AfxMessageBox("OK!");