免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2442 | 回复: 2
打印 上一主题 下一主题

自己编写的网络通信程序为何速率只有5Mbps? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-13 17:11 |只看该作者 |倒序浏览
本帖最后由 whyliyi 于 2011-01-13 17:13 编辑

自己编写了通信程序,基本的通信程序如下:

  1. /*服务器*/
  2. while(1)
  3. {
  4.         FD_SET(fdListen, &fdset);
  5.         for(i=0; i<MAX_NODE; i++)
  6.         {
  7.                 FD_SET(fdRecv[i], &fdset);
  8.                 max_fd = max_fd>fdRecv[i] ? max_fd : fdRecv[i];
  9.         }
  10.         overtime.tv_sec = 2;
  11.         overtime.tv_usec = 0;
  12.         ret = select(max_fd+1, &fdset, NULL, NULL, &overtime);
  13.         if( 0 == ret )
  14.         {
  15.                 printf("ret = 0\n");
  16.                 continue;
  17.         }
  18.         else if( -1 == ret )
  19.         {
  20.                 printf("Something Unexpected happened!...\n");
  21.                 break;
  22.         }
  23.         if( SOCK_STREAM == fdType && index <= MAX_NODE && FD_ISSET(fdListen, &fdset) )
  24.         {
  25.                 for( i=0; i<MAX_NODE; i++ )
  26.                 {
  27.                         if( 0 == fdRecv[i] &&(fdRecv[i] = AcceptSock(&fdListen, &serAddr)) )
  28.                         {
  29.                                 FD_SET(fdRecv[i], &fdset);
  30.                                 max_fd = max_fd>fdRecv[i] ? max_fd : fdRecv[i];
  31.                                 index++;
  32.                                 break;
  33.                         }
  34.                 }
  35.         }
  36.         else
  37.         {
  38.                 for( i=0; i<MAX_NODE; i++ )
  39.                 {
  40.                         //printf("\\\\");
  41.                         if( FD_ISSET(fdRecv[i], &fdset) )
  42.                         {
  43.                                 //printf("????");
  44.                                 len = -1;
  45.                                 cliLen = sizeof(cliAddr);
  46.        
  47.                                 len = RecvMsg(&fdRecv[i], msgRecv, sizeof(msgRecv), 0, (SA*)&cliAddr);
  48.                                 if( len < 0 )                        //如果<0则认为连接已经断开
  49.                                 {
  50.                                         FD_CLR(fdRecv[i], &fdset);
  51.                                         fdRecv[i] = 0;
  52.                                         index --;
  53.                                         gettimeofday(&end, NULL);
  54.                                         timeuse = 1000000 * (end.tv_sec - start.tv_sec) + end.tv_usec - start.tv_usec;
  55.                                         timeuse /= 1000000;
  56.                                         printf("Time:%f, Total Bits:%f, %fkbps\n", timeuse, total_bits, total_bits/(1000*timeuse));
  57.                                         break;
  58.                                 }
  59.                                 total_packets++;
  60.                                 if( 1 == total_packets )
  61.                                 {
  62.                                         gettimeofday(&start, NULL);
  63.                                 }
  64.                                 total_bits += 8*strlen(msgRecv);
  65.                                 break;
  66.                         }
  67.                 }
  68.         }
  69. }
复制代码
客户端数据不间断发送,采用TCP连接。
两台PC通过11G网卡连接。在客户端发送了60000包长度为1000字节的数据,结果为:
Time:83.566383, Total Bits:480014432.000000, 5744.109206kbps
表示所用时间为83.566383秒,总共发送的bit数为480014432bits,平均速率为5744.109206kbps。

但是,用同样的网卡、同样的距离,用飞鸽传书传送一个文件的速率为2MB/s,即2*8=16Mbps,这是为何?

按理说,飞鸽是一个协议,数据的接收发送都需要解包,而我的发的纯char数据的数据,速率应该不会比我的快才对阿。

请高手指教!

论坛徽章:
0
2 [报告]
发表于 2011-02-01 23:43 |只看该作者
你的代码小毛病不少,为什么做个附件的压缩包把它发全了,还遮遮掩掩的?速率的问题有时候不是一眼就能看出来的,首先你有没有测试过功能,确保你收到的数据就是你发的?

你的接收Buffer是多大?socket读数据会返回数据长度,你为什么还用strlen来得一遍长度?就算你发的是字符串,你是不是把后面的0一定发了?而且TCP不是你发的长度每次是1000字节,接收方每一次recv()就返回一次发送,你的接收用的函数是如何封装的?

论坛徽章:
0
3 [报告]
发表于 2011-02-11 09:04 |只看该作者
新年快乐
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP