首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络协议 >

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

2012-02-07 
嵌入式linux下大数据量的网络传送问题请通信程序高手帮帮忙请通信程序前辈 多多帮帮忙!小弟刚进嵌入式的

嵌入式linux下大数据量的网络传送问题<请通信程序高手帮帮忙>
请通信程序前辈 多多帮帮忙!
  小弟刚进嵌入式的门槛不久,最近在做一款中速的数据采集产品,在网络通信这块儿遇到问题,还望大家多提提意见,帮帮忙!
产品的采样率达到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,望前辈提提意见,不吝指教!


[解决办法]
你用的是tcp还是udp。 设置缓冲区不好使没关系,你可以在你的程序里建立缓冲区,随便搞几M都没人管你。

如果是TCP就很简单,一个线程死循环发送就可以了,也不用分块,用流方式传就行
[解决办法]
TCP的好处在于,你不用考虑丢包,只考虑每次意外断开连接的处理就行。

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

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

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

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


[解决办法]
1. 一定是网速大于采集速度
2. 一定要采用多线程(多任务)才能发挥最大性能。
3. 一定要注意同步处理。
[解决办法]

探讨
引用:
1. 一定是网速大于采集速度
2. 一定要采用多线程(多任务)才能发挥最大性能。
3. 一定要注意同步处理。

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

热点排行