能力值:
( LV3,RANK:20 )
|
-
-
2 楼
不要在通讯线程以外直接投递发送,上一次发送不一定发送完所有数据,会导致乱序
应该为每一个会话建一个发送队列,发送完成一个完整的包,再发送下一个
给一个客户端发送数据,就是将数据包加到该会话的队列中,并且检查该客户是否有peding中的send,如果没有,启动一次发送。
在收到一个发送完成通知时,先检查上次是否发送了全部数据,如果没有,移动一下指针,继续发送,否则,发送下一个数据包(如果发送队列不空的话)
iocp模型是很高效的,一个io投递是瞬时完成的,你程序的开销主要来自各种同步(锁等待),和你的构架关系很大
|
能力值:
( LV5,RANK:60 )
|
-
-
3 楼
case IOCP_COMPLETE_WRITE:
{
//cout<<"complete write a data!******************************"<<endl;
if(!群发完毕)
{
修改指针;
lp_io->operation =IOCP_WRITE;
}//按你所说,在这里不会占用太多时间?如果占用的时间太多,会不会错过后面的数据接收?
else
{
InitIoContext( lp_io );
lp_io->operation = IOCP_READ;
}
}
break;
|
能力值:
( LV5,RANK:60 )
|
-
-
4 楼
switch( lp_io->operation )
{
case IOCP_WRITE:
{
//cout<<"post a write data!---------------------------------------"<<endl;
//if(OnIocpWritPtr(this,lp_io,lp_key))break;
nRet = WSASend(
lp_io->socket,
&lp_io->wsaBuf,
1,
&dwBytes,
0,
&lp_io->ol,NULL);
if( ( nRet == SOCKET_ERROR ) && ( WSAGetLastError() != WSA_IO_PENDING ) )
{
cout<<"WSASend fail!------------------"<<WSAGetLastError()<<endl;
closesocket( lp_io->socket );
m_io_group.RemoveAt( lp_io );
m_key_group.RemoveAt( lp_key );
return FALSE;
}
}
break;
|
能力值:
( LV3,RANK:20 )
|
-
-
5 楼
看来你对TCPIP协议理解有问题,TCP是不会因为接收方忙而丢包的,UDP会。
TCP协议使用超时重发和确认机制会保证数据可靠地传到另一端的。
|
|
|