按道理来说TCP的传输方式不会出现丢包现象,在下也知道,可在实际使用中发现不知道自己哪里的设计有问题,在互联网上架设服务器传输测试时还是有大量的包发出去而没有收到,百思不得其解,只好前来请教各位达人了。这是服务端和客户端工程的地址:
http://www.eyesrecover.com/test/mytest.rarTCP连接方式:采用SOCKET的WSAAsyncSelect事件驱动模型。测试数据包结构:struct Test_Pack
{
char Tmp[1024];
char Buf[100];
};每个包大概1K字节出头。测试时间间隔:有1秒、0.1秒和0.01秒三种。每次开启4个客户端,然后向远程的服务端按定制的时间间隔和数量发包,客户端成功发送均进行计数,服务端收包后进行判断比较,校验是否收到了正确和完整的数据,最后统计服务端的接收数量以供判断测试结果。备注1:服务端已进行过简单的粘包处理,事实上在测试过程中未检测到粘包的问题。
备注2:客户端的发送进行过校验,如发送未成功会进行再次发送。 int Ret = ::send(m_sConnect, Buffer, Lenth, 0);
while (Ret != Lenth)
{
Sleep(1);
Ret = ::send(m_sConnect, Buffer, Lenth, 0);
}
备注3:客户端和服务端均有心跳检测。测试结果如下:局域网环境:
无论采用何种时间间隔和数量多客户端发包,服务端均能正确无误的收到全部数据并校验正确。互联网环境:
1、时间间隔为1秒或0.1秒时,服务端均能正确无误的收到全部数据并校验正确。
2、时间间隔为0.01秒时,出现大量丢包。平均丢包率30%-20%左右,且客户端总是提示全部发送完成,但服务端接收到的数量远远小于发送数。
3、时间间隔为0.01秒且启动多个客户端(超过2个)发包时,总有客户端在发包超过几百到一千左右后,提示与服务端连接丢失,SOCKET连接关闭,但服务端未能检测到该客户端的连接丢失消息。