短时间内内的大数据量传输,为何会丢包呢?

leafjessica 2007-01-15 02:06:07
从采集卡读数据,再实时传输到服务端,速度为每秒10m,运行5分钟左右,但是一共3g的数据,服务端只能收到200m,是什么问题呢?我用的是csocket类,阻塞方式
...全文
1029 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
leafjessica 2007-01-22
  • 打赏
  • 举报
回复
谢谢大家,很受益
daidongsheng 2007-01-21
  • 打赏
  • 举报
回复
如果你发送数据的数据量大,并且发送端和接收端都是同步,发送端不管接收端是否接受完毕就开始发送下一次数据,接收端缓冲区还没有来得及被处理就会被覆盖,所以会造成丢失数据.

这样的话采用异步传输,发送端等待接收端把数据处理完后再发送下一个.

采用多线程阻塞传输,当接收端没有数据的时候就一直等在那里,有数据到的时候就可以处理,同时启动另一个线程开始接收数据.

初学winsock,个人见解,有不对的地方还请大家指正~~
HewpKanXue 2007-01-21
  • 打赏
  • 举报
回复
3g/5分钟=3,000m/300s=10m/s,赫赫的
====================================
不知道你咋算的?

十兆网络的传输速度=10M/bps(这个是Bit)=10M/8
5分钟==300*10M/8=375M ,这是理论最大值阿。
换句话说,你就是百兆网络也才能传3.75G。
surefire 2007-01-21
  • 打赏
  • 举报
回复
借地方问一下,socket能从网卡抓以太网的包吗?
leafjessica 2007-01-20
  • 打赏
  • 举报
回复
楼上二位的回答我觉得很有道理,我想再问一下daidongsheng,多线程阻塞能说得清楚点吗?谢谢!
daidongsheng 2007-01-19
  • 打赏
  • 举报
回复
接收端数据堆积~可以使用异步传输,或者多线程阻塞
Analyst 2007-01-19
  • 打赏
  • 举报
回复
recv代码没问题,问题出在send端。TCP不会丢数据,你的send代码也没有问题,但是如果你的采集速度超过了网络传输的最大吞吐量,那么有两种可能,第一种采集和发送是异步的(分属两个线程),那么一部分采集数据会被丢弃,第二种采集和发送是同步的,那么发送过程会阻塞,采集的数据量会等于传输吞吐量。
吞吐量跟你的网络带宽、CPU处理速度、IO等都有关系,任何一项都可能成为瓶颈,需要具体测量来确定。
leafjessica 2007-01-18
  • 打赏
  • 举报
回复
应该是发送的数据太大造成的!这个问题有什么解决方法吗?
wj19781215 2007-01-18
  • 打赏
  • 举报
回复
1 查看send返回大小是否和你要发送的数据大小是否一致。
2 如果1中的两个大小不一致,就说明发送缓冲满了。
3 发送缓冲满,有可能是发送的数据包过大,或对方接收数据慢,接收缓冲区满。
4 从上述原因,就会丢失数据。
leafjessica 2007-01-18
  • 打赏
  • 举报
回复
我觉得DKMoggy的意见有道理啊,不如Juchiyufei也谈一谈啊,谢谢大家!
Juchiyufei 2007-01-17
  • 打赏
  • 举报
回复
此处省略100字,本贴尽供参考。 欲知详情,请发你的源代码(发送和接受的关键部分),另外建议+分。
===========
搞笑.
DkMoggy 2007-01-17
  • 打赏
  • 举报
回复
仅供参考,写错字了
DkMoggy 2007-01-17
  • 打赏
  • 举报
回复
10分有点少了, 即来之则安之。
你用的是UDP还是TCP, UDP没有连接、没有缓存。丢了不奇怪。
说说TCP丢包的原因:
严格来说TCP不可能丢包, 问题可能出在你的网络栈的大小。就发送端来说,
windows一般默认的大小是8192。 如果你试图发送>8192的数据是不会成功的。
如果缓存内有M byte的数据, 你发送>8192-M的数据同样不会成功。
此处省略100字,本贴尽供参考。 欲知详情,请发你的源代码(发送和接受的关键部分),另外建议+分。

gaooo 2007-01-17
  • 打赏
  • 举报
回复
关注,但没看到相关代码,描述也不清楚,无法深入
leafjessica 2007-01-17
  • 打赏
  • 举报
回复
“我有判断send的返回值阿,就是源程序中的mbyte值,发送首地址加上mbyte再继续发送“
楼上说的一个意思
kugou123 2007-01-17
  • 打赏
  • 举报
回复
send的时候,检查返回的字节数,这样好确认下一次发送的起始位置
leafjessica 2007-01-17
  • 打赏
  • 举报
回复
DKMoggy:

我有判断send的返回值阿,就是源程序中的mbyte值,发送首地址加上mbyte再继续发送
3g/5分钟=3,000m/300s=10m/s,赫赫
DkMoggy 2007-01-17
  • 打赏
  • 举报
回复
"严格来说TCP不可能丢包",这句话有些冲动。
TCP不保证不丢包, 但是它能保证在丢弃的时候会通知你。
DkMoggy 2007-01-17
  • 打赏
  • 举报
回复
Send也是有可能出错的,
为什不检测返回值呢?

3G/5Minute = 100M/S, 100M的网络基本达不到这个理论速度的。
leafjessica 2007-01-17
  • 打赏
  • 举报
回复
写错了,第一句为
while(nc<siz)
加载更多回复(2)

18,357

社区成员

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

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