嵌入式linux下大数据量的网络传送问题<请通信程序高手帮帮忙>

ykeastronaut 2009-09-20 06:20:06
请通信程序前辈 多多帮帮忙!
小弟刚进嵌入式的门槛不久,最近在做一款中速的数据采集产品,在网络通信这块儿遇到问题,还望大家多提提意见,帮帮忙!
产品的采样率达到100ksps到500ksps,产品板跑的是linux系统,开发板上的内存总共是32MB,用fpga来做fifo,有不到1MB的空间。如果按100ksps的采样率采样的话,基本上每秒钟会出现如下的数据量:
100 *1024* sizeof(short) 每秒! 每秒约有200kB的数据量产生。若为500ksps,则有1MB/秒 的数据。
所以我需要很快地通过网络通信程序把这些数据全部传送到windows端! 在linux端构建了一个server,专门把这数据传到windos段的客户端。关键是我的server受限于linux下网络传输的最大块4096B限制,所以基本上我一次就传输2000个数据,约有4000B,再加上一些包头96字节。我也用setsockopt来设置过发送缓冲区为8192B,但是不太好使!网络传输跟不上数据产生速度,导致了数据有丢失,这是老总坚决不同意的!

所以请教高手,对于这种大量数据的传输问题,在linux下是如何去解决的呢? 像对于agilent,NI的上兆上G采样率的产品,它们是如何实现把这种大数据传到windows端呢?

我的数据传输过程中,都是以字符数组的形式来将数据发送的。我想请问一下linux下,在网络中有二进制数据流这种传输形式吗?不解!
我的MSN:scastronaut@gmail.com QQ: 759402252,望前辈提提意见,不吝指教!
...全文
273 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ykeastronaut 2009-09-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 gumbour 的回复:]
引用 7 楼 ykeastronaut 的回复:
引用 4 楼 smartsip 的回复:
1. 一定是网速大于采集速度
2. 一定要采用多线程(多任务)才能发挥最大性能。
3. 一定要注意同步处理。

对于第一点,如果对于上G采样率的设备来讲,不见得网络速度会大于采集速度,如我们公司前段时间拿回来的agilent的1Gsps的采集卡,每秒都会出1G*sizeof(float)的数据,稍不注意就没有磁盘空间了! 当然老外是如何实现这种高速的采集设备,并将它网络传输出来,这还真值得我们去研究!

呵呵  这种情况,想一想也知道是压缩了。  原始采样数据压缩很容易的,可以根据速度和压缩比率以及是否无损压缩的要求选择不同的压缩算法。
[/Quote]
你的回复真的是很见地哈,学习提高了!很多东西,还值得我不断努力学习哈!
gumbour 2009-09-25
  • 打赏
  • 举报
回复
QQ加你了,不过我下班经常很晚,也不经常上QQ
gumbour 2009-09-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ykeastronaut 的回复:]
引用 4 楼 smartsip 的回复:
1. 一定是网速大于采集速度
2. 一定要采用多线程(多任务)才能发挥最大性能。
3. 一定要注意同步处理。

对于第一点,如果对于上G采样率的设备来讲,不见得网络速度会大于采集速度,如我们公司前段时间拿回来的agilent的1Gsps的采集卡,每秒都会出1G*sizeof(float)的数据,稍不注意就没有磁盘空间了! 当然老外是如何实现这种高速的采集设备,并将它网络传输出来,这还真值得我们去研究!
[/Quote]
呵呵 这种情况,想一想也知道是压缩了。 原始采样数据压缩很容易的,可以根据速度和压缩比率以及是否无损压缩的要求选择不同的压缩算法。
ykeastronaut 2009-09-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 smartsip 的回复:]
1. 一定是网速大于采集速度
2. 一定要采用多线程(多任务)才能发挥最大性能。
3. 一定要注意同步处理。
[/Quote]
对于第一点,如果对于上G采样率的设备来讲,不见得网络速度会大于采集速度,如我们公司前段时间拿回来的agilent的1Gsps的采集卡,每秒都会出1G*sizeof(float)的数据,稍不注意就没有磁盘空间了! 当然老外是如何实现这种高速的采集设备,并将它网络传输出来,这还真值得我们去研究!
ykeastronaut 2009-09-24
  • 打赏
  • 举报
回复
To gumbour:
我最近在学习RPC机制的使用,因为工作需要,要实现vxi-11协议! 如果你方便的话,加我QQ或者MSN,有机会多向你学习学习!
我留个联系方式在帖子里边,就是希望交上几个同行,互相交流,学习哈!
ykeastronaut 2009-09-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 gumbour 的回复:]
TCP的好处在于,你不用考虑丢包,只考虑每次意外断开连接的处理就行。

发包,不用刻意按照小块去发。

你应该一个线程成采样,另一个任务发送,2个任务可以交换缓冲区(可以多个缓冲区组成一个链表循环使用,交换时注意任务互斥),
一般来说发送速度肯定是远快于采集的。

假设你每个缓冲区2000000字节,发送任务直接用下面循环发送一个缓冲区
totalsend = 0;
while( totalsend < 2000000)
{
  sendbyte = send(socket,buf+totalsend,2000000-totalsend);
  totalsend += sendbyte ;
}   

事实上,通常采用更小的缓冲区,交换时间也更短,就足以满足要求。这样,只要网卡速度狗,上G也没有问题。
[/Quote] 这确实是个不错的思路哈!开辟多个缓冲区组成的链表结构,以及后面的发送数据思路。但是对于发送代码,我觉得,比如每一数据是int型的,它们放在buffer中,如果只发送了sendbyte%sizeof(int)!=0的情况,也即发送的字节总数不是sizeof(int)的整数倍,那我在接收端就不太好处理这个问题,或者比较麻烦嘛!
你经常玩网络通信吧,呵呵如果方便的话,加我qq或者MSN,平时多向你学习学习,多交流交流哈!
smartsip 2009-09-24
  • 打赏
  • 举报
回复
1. 一定是网速大于采集速度
2. 一定要采用多线程(多任务)才能发挥最大性能。
3. 一定要注意同步处理。
gumbour 2009-09-22
  • 打赏
  • 举报
回复
TCP的好处在于,你不用考虑丢包,只考虑每次意外断开连接的处理就行。

发包,不用刻意按照小块去发。

你应该一个线程成采样,另一个任务发送,2个任务可以交换缓冲区(可以多个缓冲区组成一个链表循环使用,交换时注意任务互斥),
一般来说发送速度肯定是远快于采集的。

假设你每个缓冲区2000000字节,发送任务直接用下面循环发送一个缓冲区
totalsend = 0;
while( totalsend < 2000000)
{
sendbyte = send(socket,buf+totalsend,2000000-totalsend);
totalsend += sendbyte ;
}

事实上,通常采用更小的缓冲区,交换时间也更短,就足以满足要求。这样,只要网卡速度狗,上G也没有问题。

ykeastronaut 2009-09-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gumbour 的回复:]
你用的是tcp还是udp。  设置缓冲区不好使没关系,你可以在你的程序里建立缓冲区,随便搞几M都没人管你。

如果是TCP就很简单,一个线程死循环发送就可以了,也不用分块,用流方式传就行
[/Quote]

我用的TCP,老总是绝对不允许一个数据丢失的。确实今天我在程序里边开了个2MB的缓冲区,竟然程

序运行良好! 呵呵 唯一的不足是,今天还没有对修改后的服务器程序进行验证。但是这种情况也有问

题,如果对于20Msps或者更高速的上G采样率的采集产品来说,这种方法也不能很好地解决问题嘛!
我的发送过程是这样的:取出2000个采样点,然后添上包头,组装成一个数据包,放在一个字符串

数组所构成的缓冲区,来将数据一点点地发送出去,问题就是每次都发送这么点数据量,对于高速的产

生数据的情况,这很不够啊!局域网里边传东西,不是能达到几Mb的情况吗?用板上的linux系统做

server端,能达到windows下的那种局域网内高速传送的效果吗?
另外对于你所说的“也不用分块,用流方式传就行”,用流传输,是不是还要借助于程序中我们自

己开辟的发送缓冲区,也即一个字符串数组?
gumbour 2009-09-22
  • 打赏
  • 举报
回复
你用的是tcp还是udp。 设置缓冲区不好使没关系,你可以在你的程序里建立缓冲区,随便搞几M都没人管你。

如果是TCP就很简单,一个线程死循环发送就可以了,也不用分块,用流方式传就行

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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