问题:如果用阻塞的操作,当我的一个线程在accept或者recv的话,如何中止掉它?或者只能通过强行将线程中止掉?

解决方案 »

  1.   

    Try *select* winsock call before calling recv.
    here is code fragment.
        fd_set  readfds;
        FD_ZERO (&readfds);
        FD_SET (m_hSock, &readfds);
        if (::select(0, &readfds, NULL, NULL, &g_timeOut) == 1)
            return (::recv (m_hSock, (char*)m_szBuf, MSG_LENGTH, NO_FLAGS_SET));
        return 0;
      

  2.   


    closesocket(); 任何阻塞都会返回。
      

  3.   

    我的办法是:
    在accept()或recv()/send()的线程,先进行一个类似RequestWaitEvent(ThreadID)的调用,取得一个WSAEVENT句柄,然后,用WSAEventSelect()设置socket,然后WSAWaitForMultipleObject()需要维护一个ThreadID-EventHandle的表,可能有点麻烦
      

  4.   

    线程创建后并不立即运行,创建它的线程完成了ThreadID的传递后,才使它运行
      

  5.   

    Great_Bug那如果程序要移植到Unix下,还能使用你说的方法吗?
      

  6.   

    MS的winsock 2 支持socket和event的联接,不知道在Unix下面是什么情况
    如果不支持,就不可行
    我不熟悉Unix