查了好多资料: 都是
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 偶尔会造成网络出错)
请达人指教. 如果解释好的话. 再加分答谢!!
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 偶尔会造成网络出错)
请达人指教. 如果解释好的话. 再加分答谢!!
答:这要看你怎么写了,如果在其它地方WSARecv那么这里就不需要,不过
一般的逻辑来说,建立了一个连接之后那么服务器应该准备接收客户端的数据
所以一般的代码会在这个位置WSARecv。还有一方面需要注意,如果没有PostRecv的话,那么在完成端口的工作线程
就不会返回一个接收的完成。这里不知道你所说的buf缓冲区数据已经存在是
啥意思?至于post read会出错,那肯定是因为代码的逻辑问题导致的