关于tcp网络大数据传输 500ms内需要接收7M左右的大数据网络包,用VC实现,需要怎样写接收端的程序?不甚感激! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 7MB/0.5s=14MB/s=112Mbit/s百兆网满足不了。 简单,满足网络条件的情况下,如果你只是针对于这一个条件(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来做协议处理 }}以上步骤完全满足你所设定的场景要求 不需在特别的设置啊. 你只需要用TCP, 一边不停的发送, 一边不停的接收就能搞定.每次发送的数据大一点, 比如一次发送1M.然后, 最好不要有磁盘IO操作, 因为这个会比较慢.我们有千兆网下, 接收速度最高可达125MB/s 已经基本达到千兆极限.但有些电脑会因为网卡或者CPU的原因, 达不到.这么高, 但 30MB/s -- 50M/s 一般的电脑都能达到.你才14MB/s, 完全没有问题. 现在是程序是把一次读取的数据量设置为8000byte,循环读取,直到7M的数据全部读完,但是运行一个多小时后,会出现网络接收获取数据失败的现象,不知道该如何解决。 失败就要看失败原因,也不是所有的“失败”都是表示失败。比如异步socket返回-1,GetLasterror()返回10056,这并不表示失败,而仅仅是表示“你的请求我接受了,你安心的等待结果就好了”。 所以说要具体问题具体分析。另外就是“TCP的粘包”问题导致的读取数据问题,这个问题主要原因是coder们没有定义好“规则”或者定义好了“规则”,但是没有处理好“规则”。 使用VC编程,recv函数接收数据,返回值为-1,错误代码是10060 10060 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。任何收发两端速度不一致的通讯,都需要在它们之间使用一个足够大的FIFO缓冲区。对任何FIFO缓冲区的使用,都需要仔细考虑接收端接收时超时无数据和发送端发送时FIFO缓冲区已满这两种情况下该如何做。 MFC的类库结构实在是太差了!!比QT差远了! 删除CListCtrl行要POST什么消息用::POSTMESSAGE...... bho编译不通过,求救! IDE环境的问题(急!) 怎么显示非模式对话框? 如何从一个字符指针中取出一个字符。 能否给个试图切换的代码 两个对话框程序间通讯 如何改变editbox中的字体及大小,我用SetFont不起作用? 怎样去掉子窗口(childframe)的凸起的边框? CWgraph控件 WM_QUERYENDSESSION 中无法运行netsh 命令
百兆网满足不了。
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来做协议处理
}
}
以上步骤完全满足你所设定的场景要求
你只需要用TCP, 一边不停的发送, 一边不停的接收就能搞定.每次发送的数据大一点, 比如一次发送1M.
然后, 最好不要有磁盘IO操作, 因为这个会比较慢.我们有千兆网下, 接收速度最高可达125MB/s 已经基本达到千兆极限.但有些电脑会因为网卡或者CPU的原因, 达不到.这么高, 但 30MB/s -- 50M/s 一般的电脑都能达到.你才14MB/s, 完全没有问题.
失败就要看失败原因,也不是所有的“失败”都是表示失败。
比如异步socket返回-1,GetLasterror()返回10056,这并不表示失败,而仅仅是表示“你的请求我接受了,你安心的等待结果就好了”。 所以说要具体问题具体分析。另外就是“TCP的粘包”问题导致的读取数据问题,这个问题主要原因是coder们没有定义好“规则”或者定义好了“规则”,但是没有处理好“规则”。
对任何FIFO缓冲区的使用,都需要仔细考虑接收端接收时超时无数据和发送端发送时FIFO缓冲区已满这两种情况下该如何做。