宁静以致远
zgf的blog
<2008年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

留言簿(15)

随笔分类

随笔档案

文章档案

友情链接

资料收藏

搜索

最新评论

阅读排行榜

评论排行榜

 
VC知识库BLOG   首页  新随笔  联系  聚合  登录 
  随笔-31 文章-8 评论-99 Trackbacks-0

        同事在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)  编辑 收藏
Comments
  • # re: tcp发送速度好像需要控制
    周星星
    Posted @ 2008-07-14 21:20
    当 ( 发送缓冲区满 or 设定的时间过了 ) and 对方接受缓冲区不满 时 发送数据。
  • # re: 周星星
    zgf的blog
    Posted @ 2008-07-14 21:29
    问题是传输恢复不了。正常应该wince端接收一些数据后,PC端又能再发送一些数据。但实际是PC再也没机会发送数据了,直接超时跳出来,然后wince端返回10060错误跳循环
  • # re: tcp发送速度好像需要控制
    玻璃小屋
    Posted @ 2008-07-14 21:58

    CE 网络驱动吗?CE上的网络硬件是什么?阻塞的话,速度就是吞吐量最小的一方的速度啊。
  • # re: 玻璃小屋
    zgf
    Posted @ 2008-07-15 11:04
    我现在只是在模拟器上测试。并且发现,如果在wince模拟器上跑两个程序,一个单发送,一个单接收。这样PC和模拟器上的程序都不用sleep,可以全速发送。
  • # re: tcp发送速度好像需要控制
    zgf
    Posted @ 2008-07-15 13:20
    哈哈哈。同事将驱动中MTU大小从默认的1512改到1400后就可以流畅的全速同时收发了。虽然速度比较慢,接收2.4M bit/s  发送 700k bit/s。 
  • # re: tcp发送速度好像需要控制
    Diviner
    Posted @ 2008-07-16 18:08
    嵌入式设备协议栈有时候实现得是有限制的。
  • # re: tcp发送速度好像需要控制
    brent
    Posted @ 2008-07-22 09:17
    以前给希腊客户做了一个,TDI层写的PC流量控制,不只有监视,还可以控制。

    用处: 公司服务器安装,每台PC安装一个客户端
    1. 实现控制,开启,断开
    2. 输入流量分配卡号,查看客户端使用流量,图表。
    3. 登录主机监控设置,管理员权限。
    4. 脱管报警,断网。
  • # re: tcp发送速度好像需要控制
    brent
    Posted @ 2008-07-22 09:20
    5. 还可以监控每个客户端EXE文件的流量,发预警! 主动和强制减流量


    lz参考一下。
  • # re: tcp发送速度好像需要控制
    mcs51a
    Posted @ 2008-07-30 22:02
    遇过同样的问题,事后想想,有两种情况,
    1.网络不好,导致 TCP 流量和重发 控制起作用。
    2.WINCE程序,未能及时处理,缓冲区满导致TCP通告窗口为零。
  • # re: tcp发送速度好像需要控制
    mcs51a
    Posted @ 2008-07-30 22:09
      10060这种情况,应该是网络不好,TCP在重发一定次数后,未能收到ACK响应。导致的错误
标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]