我在一个程序中以CAsyncSocket来实现基于TCP协议的数据定时传输。在服务器端,通过timer的触发定时向建立连接的客户端发送数据。
当服务端与客户端程序放在同一机器上时,没什么问题。
当服务端与客户端程序分别放在两台机器上时。客户接收数据明显有延迟。
测试发现,当发送的时间间隔大于200ms时,没问题。当服务端timer的间隔小于200ms时,就会有问题;
设置timer的间隔为30ms,一个服务端与一个客户端相连。
测试的数据如下
ID c_interval time s_interval
6 0.000160076 0.178354 0.0312738
7 0.199633 0.377988 0.0312378
8 0.000194438 0.378182 0.0312422
9 0.000160076 0.378342 0.0314398
10 0.000157562 0.378660 0.0312520
12 0.000158400 0.378818 0.0312428
13 0.000160076 0.378978 0.031247
14 0.199273 0.578251 0.0312464
ID: 包号
c_interval:客户端程序收到包号为ID的数据包与收到(ID-1)包间的时间间隔
time: 客户端程序收到包号为ID的数据包的时间
s_interval:服务端发送ID包与发送ID-1包之间的时间间隔。
由数据可见,服务端发送基本上是30ms一次;而接收却好象是200ms才接收一次。100Mb下也类似。
本人拙笨,百思不解,请教高人指点迷津。谢谢!!!
若问题得解,另外送分。
我用过CAsyncSocket,没有上述问题,64K的数据块,SetTimer(1,25,NULL)时,没有问题.
在接收端,用:
void CMsocket::OnReceive(int nErrorCode)
{
int nError = ReceiveFrom (&m_data,sizeof(sock_data), m_strSendersIP, m_nSendersPort);
.......................自动处理
//::PostMessage(GetActiveWindow( ),WM_COMMAND,WM_RECEIVE,(LPARAM)0);
CAsyncSocket::OnReceive(nErrorCode);
//AfxMessageBox("收到数据!");
}
收到数据时自动处理或发出消息.
TCP为防止包太小而浪费带宽,会等一下再发送,期待应用程序发送更多数据。等待时间为200ms。
如果要立刻发送,好像是setsockopt,参数SO_DONTLINGER。