我想要实现的是:同一个socket,两个recv函数,其中一个在while(true)下,时刻准备接收,另一个在特定情况下用.当我打算用第二个recv的时候,暂停第一个recv函数.
现在这样: 
在第一个recv处,将socket设置成非阻塞: C/C++ code
while(true)
{
    unsigned long ul=1;   
    ioctlsocket(sock,FIONBIO,&ul);
    int retval=recv(sock,RecvBuff,2000,0);
      ......
}在第二个recv处,将socket设置成阻塞: C/C++ code
SuspendThread(m_hThread);
unsigned long ul=0;   
ioctlsocket(m_SockClient,FIONBIO,&ul);
char RecvBuff[2000];
memset(RecvBuff,0,2000);
int retval=recv(m_SockClient,RecvBuff,2000,0);
ResumeThread(m_hThread);
......其中第一个recv在线程m_hThread中,所以要用到时先用SuspendThread把它挂起.这样大部分情况下相安无事,可是少数时候程序会死掉,经调试发现程序是停在第二个recv的ioctlsocket(m_SockClient,FIONBIO,&ul);这条语句上. 
想想原因,估计是当分线程挂起时正停在ioctlsocket(sock,FIONBIO,&ul);中,所以当又一次调用时,出现了这样的差错,不知道是否是这样呢?这种情况该如何解决? (两个socket名字不一样,但其实是同一个) 

解决方案 »

  1.   

    第一个非阻塞socket那里改下,不要这么玩命循环
    用overlapped方式,然后wait那个overlapped句柄和一个自定义eventint retval=recv(sock,RecvBuff,2000,&ol); 
    WaitForMultiObject(...);第二个recv准备开始的时候设置这个事件,第一个recv线程的wait就会结束,然后在第一个线程CancelIO------------------------------ 
    C++网络服务器开发群(QQ)招新,不欢迎c++入门级新手,群号41356711 
    群上限200,目前群内170+人,加群请注明自己目前情况 
    主要讨论方向:网络和多线程服务器开发、IOCP等
      

  2.   

    1 添加锁,
    2 ioctlsocket(sock,FIONBIO,&ul); 在循环外面设置一次就够了
      

  3.   

    charm说得对,我现在是用了CEvent+ioctlsocket算是可以实现了,不过理论上也许还存在出问题的可能。“tcp有紧急数据和带外数据的”这什么意思?可以根据这个来判断是否接收吗?
      

  4.   

    应该是这样,使用一个临界区就行了;查查线程同步方面的资料!在第一个recv处,将socket设置成非阻塞: C/C++ code 
    while(true) 

        criticalSection.Lock()
        unsigned long ul=1;  
        ioctlsocket(sock,FIONBIO,&ul); 
        int retval=recv(sock,RecvBuff,2000,0); 
          ...... 
        criticalSection.Unlock();

    在第二个recv处,将socket设置成阻塞: C/C++ code 
    criticalSection.Lock();
    unsigned long ul=0;  
    ioctlsocket(m_SockClient,FIONBIO,&ul); 
    char RecvBuff[2000]; 
    memset(RecvBuff,0,2000); 
    int retval=recv(m_SockClient,RecvBuff,2000,0); 
    ResumeThread(m_hThread); 
    ...... 
    criticalSecion.Unlock();注意:CCriticalSection criticalSection为全局变量。