TCP/IOCP/Windows
Console 程序。我使用 WSAAccept()  发现一个问题,有时候,即使是刚开启服务器,然后client连过来,都有阻塞的情况发生。必须Ctrl+C 才可以把服务器唤醒。void MainThread()
{
  for( ;; )
   {
     WSAAccept()
   }
}void QueryIOCPStateThread()
{
  for( ;; )
  {
   }
}这个,确定是 WSAAccept 的问题么?(我个人是有点怀疑,有经验的朋友帮忙说说。谢谢)

解决方案 »

  1.   

    accept和acceptEx都可以,
    accept需要多开启一个线程。
    Ex的可以省一个线程,但在工作线程中多出一项switch case 因为ex投递了操作。wsaAccept的没用过。
      

  2.   

    我的是console程序,直接在main里循环 WSAAccept()还有必要再开一个 AcceptThread 么?
      

  3.   

    刚看了一下, WSAAccept()用法和Accept的用法非常类似,阻塞方式接受一个连接,因此也要开一个线程。
      

  4.   

    不开线程在main里阻塞也行,但不是太好,比如将来移植到窗口程序上,就要改很多代码,
    另开一线程吧。
      

  5.   

    偶用的是AcceptEx,AcceptEx可以让Accept操作也异步完成。
      

  6.   

    并会顺便带会收到的第一个数据包。针对WWW一类的需要频繁建立断开连接的情况,性能应该有大的提升。如果Accept操作本身不是很频繁的话,对性能影响不大。
      

  7.   

    To Delphityro:你说的有道理,但因为我需要打印输出运行逻辑线,所以,喜欢console。
    如果用窗口的话,相对来说难一点找到错误发生处。
    to DentistryDoctor:我也想改为 AcceptEx,今天就试下。
      

  8.   

    这个函数好像不是这样用的,iocp有三种操作会引起一个异步的io,accpet,read,write,因此完全可以预先开accpet然后放入完成队列中,如果有回应,那么就在工作者线程中处理