查了好多资料:  都是
result = GetQueuedCompletionStatus(pThis->m_hIocp,&n,&key, (OVERLAPPED **) &pov, INFINITE );
switch(pov->state)

case stAccepting:
 pov->state=stReading;
GetAcceptExSockaddrs( &pov->buf[0], 0,IPADDRLENGHT,IPADDRLENGHT, (sockaddr **) &plocal, &locallen,(sockaddr **) &premote, &remotelen );
setsockopt( pov->skt, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT,(char *) &pThis->m_slistener, sizeof SOCKET );
CreateIoCompletionPort( (HANDLE) pov->skt, pThis->m_hIocp, 0, pThis->m_concurrency);
   break;
case stReading:
 Wsarecv(...);
break;
}
但是看很多的代码:
result = GetQueuedCompletionStatus(pThis->m_hIocp,&n,&key, (OVERLAPPED **) &pov, INFINITE );
switch(pov->state)

case stAccepting:
 pov->state=stReading;
GetAcceptExSockaddrs( &pov->buf[0], 0,IPADDRLENGHT,IPADDRLENGHT, (sockaddr **) &plocal, &locallen,(sockaddr **) &premote, &remotelen );
setsockopt( pov->skt, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT,(char *) &pThis->m_slistener, sizeof SOCKET );
CreateIoCompletionPort( (HANDLE) pov->skt, pThis->m_hIocp, 0, pThis->m_concurrency);
  wsarecv(...)/* 多了这行.非得要读吗? 请达人指教!!!!!!!!!!!!! */ 
   break;
case stReading:
 Wsarecv(...);
break;
}在监听的代码如下:
ov.skt = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if ( ov.skt != INVALID_SOCKET )
{
ov.state = stAccepting;
setsockopt( ov.skt, SOL_SOCKET, SO_SNDBUF, (char *) &zero, sizeof zero );
setsockopt( ov.skt, SOL_SOCKET, SO_RCVBUF, (char *) &zero, sizeof zero );
memset( ov.buf, '\0', sizeof ov.buf );
AcceptEx( m_slistener, ov.skt, &ov.buf[0],0, IPADDRLENGHT,IPADDRLENGHT, &ov.nRecvLenght, &ov );
}请问在post接受还要post read 吗? 
本人现在在数据正常处理时,根本就没有post read.居然可以工作;
(buf 的缓冲区.数据已经存在. post read 偶尔会造成网络出错)
请达人指教.  如果解释好的话. 再加分答谢!!

解决方案 »

  1.   

    wsarecv(...)/* 多了这行.非得要读吗? 请达人指教!!!!!!!!!!!!! */  
    答:这要看你怎么写了,如果在其它地方WSARecv那么这里就不需要,不过
    一般的逻辑来说,建立了一个连接之后那么服务器应该准备接收客户端的数据
    所以一般的代码会在这个位置WSARecv。还有一方面需要注意,如果没有PostRecv的话,那么在完成端口的工作线程
    就不会返回一个接收的完成。这里不知道你所说的buf缓冲区数据已经存在是
    啥意思?至于post read会出错,那肯定是因为代码的逻辑问题导致的
      

  2.   

    调用WSARecv就代表post read了,你要准备接受客户端的数据,调用WSARecv就行