我在一个线程(线程一)里使用GetQueuedCompletionStatus等待I/O事件的发生,
能够接受连接,
但接受连接后,我马上使用另一线程(线程二)的WSARecv去读数据,
线程一可以接受到读取事件,但为什么就是GetQueuedCompletionStatus函数总是失败啊?在accept时,我使用的AcceptEx中的lpOverlapped参数使用的是一个数据结构(结构一),
在WSARecv时是使用的另一个结构(结构二),但Overlapped是使用结构一的overlapped的拷贝.不知道为什么老是GetQueuedCompletionStatus失败啊!
很急啊,大家帮帮忙!
先在这里谢谢大家了.样子是这样的:
线程一:
while(TRUE)
{
    GetQueuedCompletionStatus();
    ........
}线程二:
while(TRUE)
{
   //等待事件,事件有信号执行下面的
   WSARecv();
   ..........
}
在执行WSARecv后线程一可以接受到事件,但总是返回失败.
调了半天了,希望大家帮帮忙,谢谢!

解决方案 »

  1.   

    呵呵,好像完成端口不是这么做的,至少我不是这么做的,你应该直接在线程1中直接做事情,不需要在线程2中做WSARecv的事情
    1、完成端口GetQueue函数完成时,你应该判断dwIOSize的值,它指明了发送或者接收的字节数,你不需要再试图用wsarecv去接收数据,使用wsarecv应该是你希望让完成端口去接收的时候。一般这个时候wsarecv应该返回的是WSA_IO_PENDING
      

  2.   

    2、为了提高效率,你可以使用多个线程同时GetQueue,就是同一个线程函数来操作
      

  3.   

    wsarecv返回什么错误呢?如果是0或者997,表明正常,这时GetQueuedCompletionStatus应该能够得到正确结果,如果不正确,那么调用WSAGetOverlappedResult(参数传wsarecv时的重叠结构),然后再调用wsagetlasterror看发生了什么错误
      

  4.   

    GetQueuedCompletionStatus()返回后,你分析接收到的数据,可以直接处理,也可以开另外的线程处理,看你对实时的要求如何了,通常处理完成后,在原GetQueuedCompletionStatus()线程里继续WSARecv来接收下一个数据。