同事在wince下写了个网络驱动,让我帮忙写个小程序测试网络流量。这还不简单。三下五除二一下子写了个测试程序出来。主体思想是建立连接后创建两个线程,一个专门收,一个专门发。然后定时统计收发的数据长度。主要代码如下:
//发送线程
void * __stdcall thread_send(void * lpparam)
{
int slen;
SOCKET m_sock = (SOCKET)lpparam;
char * send_buf = (char *)malloc(1024);
while(!bthreadstop)
{
slen = send(m_sock,send_buf,1024,0);
if(slen == SOCKET_ERROR)
{
CString str;
str.Format(_T("send error:%d"), WSAGetLastError());
AfxMessageBox(str);
break;
}
total_send += slen;
Sleep(50);
}
free(send_buf);
return 0;
}
//接收线程
void * __stdcall thread_recv(void * lpparam)
{
int rlen;
SOCKET m_sock = (SOCKET)lpparam;
char * recv_buf = (char *)malloc(1024);
while(!bthreadstop)
{
rlen = recv(m_sock,recv_buf,1024,0);
if(rlen == SOCKET_ERROR)
{
CString str;
str.Format(_T("recv error:%d"), WSAGetLastError());
AfxMessageBox(str);
break;
}
total_recv += rlen;
}
free(recv_buf);
return 0;
}
void CTcptest_ceDlg::OnButtonConnect()
{
...... //连接代码省略
//connect ok.
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)thread_recv,(void *)m_sock,0,0);
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)thread_send,(void *)m_sock,0,0);
}
满怀信心的交给同事去测试。才一会儿问题就出现了。使用同样的代码,一个用evc编译后在wince模拟器上跑,另一个用vc编译后在PC上跑。
现象:
1. 终端发 PC收 持续一分钟没断线。
2. 终端收 PC发 持续一分钟没断线。
3. 终端和PC同时收发,几秒后终端发送和接收的数据都为零。
改用两台PC互相通信。 同样的代码,同时收发速度达到11.9Mbyte/s。这个速度还算正常,也证明了我的代码至少表面上是OK的。
添加打印后发现 PC 在开始的1秒内发送64K的数据后就停住了,后面持续很久发送数据量都为零。总的表现就是PC端猛的发一下数据,然后等待,然后又猛的发一下数据,又等待。如是循环。 根据http://www.techrss.cn/html/2007/05-20/18912.htm帖子说明似乎是PC发送太快了。 在PC的send线程中sleep一下,情况确实有所改善。等待10ms时,传输大约3M的数据后不能再发送。 等待50ms时,传输了大约50M的数据。
这是个很奇怪的问题。为什么PC发得太快会导致wince终端网络不能收发呢?
posted on 2008-07-14 20:31 zgf的blog 阅读(1094)
评论(10) 编辑 收藏