关于tcp网络大数据传输

tdrcxt 2017-02-27 03:06:16
500ms内需要接收7M左右的大数据网络包,用VC实现,需要怎样写接收端的程序?不甚感激!
...全文
981 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohuh421 2017-02-28
  • 打赏
  • 举报
回复
不需在特别的设置啊. 你只需要用TCP, 一边不停的发送, 一边不停的接收就能搞定. 每次发送的数据大一点, 比如一次发送1M. 然后, 最好不要有磁盘IO操作, 因为这个会比较慢. 我们有千兆网下, 接收速度最高可达125MB/s 已经基本达到千兆极限. 但有些电脑会因为网卡或者CPU的原因, 达不到.这么高, 但 30MB/s -- 50M/s 一般的电脑都能达到. 你才14MB/s, 完全没有问题.
赵4老师 2017-02-28
  • 打赏
  • 举报
回复
10060 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。 任何收发两端速度不一致的通讯,都需要在它们之间使用一个足够大的FIFO缓冲区。 对任何FIFO缓冲区的使用,都需要仔细考虑接收端接收时超时无数据和发送端发送时FIFO缓冲区已满这两种情况下该如何做。
tdrcxt 2017-02-28
  • 打赏
  • 举报
回复
使用VC编程,recv函数接收数据,返回值为-1,错误代码是10060
shenyi0106 2017-02-28
  • 打赏
  • 举报
回复
引用 6 楼 tdrcxt 的回复:
现在是程序是把一次读取的数据量设置为8000byte,循环读取,直到7M的数据全部读完,但是运行一个多小时后,会出现网络接收获取数据失败的现象,不知道该如何解决。
失败就要看失败原因,也不是所有的“失败”都是表示失败。 比如异步socket返回-1,GetLasterror()返回10056,这并不表示失败,而仅仅是表示“你的请求我接受了,你安心的等待结果就好了”。 所以说要具体问题具体分析。 另外就是“TCP的粘包”问题导致的读取数据问题,这个问题主要原因是coder们没有定义好“规则”或者定义好了“规则”,但是没有处理好“规则”。
tdrcxt 2017-02-28
  • 打赏
  • 举报
回复
现在是程序是把一次读取的数据量设置为8000byte,循环读取,直到7M的数据全部读完,但是运行一个多小时后,会出现网络接收获取数据失败的现象,不知道该如何解决。
tdrcxt 2017-02-28
  • 打赏
  • 举报
回复
实际使用过程中,读取的是字符串数据,经测试一次只能读取约为8000长度的字符串,需要采用循环读取方式来读取,这种方式在长时间运行后会出现某一包读不上来的情况,不知道这种现场各位大神有没有遇到过。
shenyi0106 2017-02-27
  • 打赏
  • 举报
回复
简单,满足网络条件的情况下,如果你只是针对于这一个条件(500ms接收7MB字节),那么只需要做如下操作即可:

char *buf = NULL;
int  index =0, pkt_len = 8 * 1024 * 1024;

// 省略指针检查
buf = new char[pkt_len];
memset(buf, 0, pkt_len);

while (TRUE)
{
      int len = recv(buf + index,  pkt_len - index);  // 简化的接收API,仅仅为了说明流程
      index += len;
      
     if (index >= x)  // x为你设定的或者通过协议头所获取的包长度
     {
             // do anything
             //  你可以在这里做协议处理,也可以转到另一个缓冲区中通过worker来做协议处理
     }
}
以上步骤完全满足你所设定的场景要求
tdrcxt 2017-02-27
  • 打赏
  • 举报
回复
这边用的是千兆网
赵4老师 2017-02-27
  • 打赏
  • 举报
回复
7MB/0.5s=14MB/s=112Mbit/s 百兆网满足不了。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧