a>IsBlocking()函数应该在套接字进程中调用!
b>当套接字已经阻塞时,可以调用CancelBlockingCall从阻塞中解脱出来;
  位置应该放在:
 >>套接字进程中
 >>或当前正在运行的进程中
 >>或主进程中

解决方案 »

  1.   

    在单线程的程序中,阻塞是不可避免的,解决这个问题的办法就是利用CSocket/CAsyncSocket的多线程特性,我最喜欢的一种方法就是从 CAsyncSocket 派生自己的类CMySocket ,再由它向主窗口发送各种消息.CMySocket ::public CAsyncSocket 
    {
    CWnd * m_pWnd; 
    CMySocket (CWnd * pWnd){m_pWnd=pWnd}; //此处保留主窗口
    ...
    //定义消息映射函数
    ...
    }CMySocket ::OnReceive(...)
    {
    m_pWnd->PostMessage(...); //可用系统消息,也可自定义.
    }...
      

  2.   

    从 CAsyncSocket 派生自己的类CMySocket ,在该类的OnReceiver中接收服务端的数据,并进行处理,如果要发送数据,可以直接使用send函数。这里要用循环判断是否完全发送成功,接收时也要判断接收数据的正确性。
      

  3.   

    用异步方式不会阻塞呀
    比如Receive函数,应该在OnReceive中调用,因为这时已经有数据了,所以函数会立即返回。
    其它函数也差不多。
      

  4.   

    有关阻塞的问题:
    如果要解决阻塞的问题,可以使用select函数(API),这个函数可以设置一个超时值,在超过超时值之后可以自动返回。另外,阻塞与死循环是不一样的,在阻塞时,线程(进程)是不占用时间片的,不会占用太多的系统资源,而死循环则往往会过度占用系统资源。
    如果你是在重载的OnReceive函数中调用Receive函数,那么这个函数并不会引起阻塞。
      

  5.   

    谢谢大家的热心帮助,能跟人讨论感觉是不一样。
    Receive()函数是不是一定要在OnReceive()函数中调用呢?还有,我在客户端程序一启动就执行的函数中曾经用广播寻找服务器(局域网),服务器端的数据报套接字收到广播后(的确能收到)用刚得到的对方端口和地址返回应答SendTo():
    //收广播
    RadioSock.ReceiveFrom(m_lpBuf,512,rPeerAddr,rPeerPort);
    ...
    //返回应答
    RadioSock.SendTo(m_lpBuf,20,CLIENT_ACKPORT,rPeerAddr);但在客户端:
    //发送广播
    DgramSock1.SendTo(lpBuf,10,HOST_RADARPORT);
    ……
    //等待应答
    DgramSock2.ReceiveFrom(lpBuf,512,rHostAdd,rHostPort);
    程序到了上面的最后一条语句,就再也出不来了,(阻塞?)该怎办???又提了问题,帖子该加分了。
      

  6.   

    00h,I'm eager for your touch
      

  7.   

    Receive()并不是一定要在OnReceive()中调用,你可以在任何你想用的地方使用,OnReceive只是一个消息通知函数,主要作用是告诉你现在有数据传来,请接收!
      

  8.   

    zhq2000你好,按你说要是我在一处使用循环调用Receive(),就象读文件一样,希望读到到文件尾时返回0字节,调用Receive()返回0时,循环结束。可是这样是不是容易造成阻塞啊?
    假如我希望接收连续的一块一块的数据,那该怎么办?