Matlab TCP-IP服务器无损传输

时间:2016-01-17 19:46:55

标签: matlab tcp

我已经尝试过并且未能在Matlab中实现TCP-Listen服务器,即#34;无损"。无损,我的意思是使用linux socat实用程序发送文件:

socat -u file.bin TCP4:127.0.0.1:50000

在Matlab中收到与该文件完全匹配的字节:

function t = test
fid = fopen('x','W');
t =tcpip('0.0.0.0',50000,'NetWorkRole','server','InputBufferSize',50*1024^2);
t.BytesAvailableFcnMode = 'byte';
t.BytesAvailableFcnCount = 1024^2;
t.BytesAvailableFcn = {@FCN, fid };
fopen(t);
function FCN( obj, event, fid )
x=fread( igetfield(obj, 'jobject'), obj.BytesAvailable, 0, 0);
fwrite( fid, x(1),'int8' );

我已经测试了这一点,并且在传输速率方面取得了不错的成功(没有fwrite和文件使用/ dev / zero,它使千兆链路饱和),以及低CPU负载。诀窍是绕过Matlab的tcpip()默认包装器*,并通过以下方式访问较低级别的方法:

igetfield(obj,'jobject')

对于我测试的2139160576 Byte文件,它通常会收到~2139153336字节。我已经尝试了各种其他实现,它们将fread()输出接收到结构,单元格和数组连接中。他们也缺少一些KiB。我尝试过512个随机字节的重复模式;一个测试在开始时有字节不匹配。

Socat-> Socat转移(显然)。

Socat-> my-matlab-code在fopen()中保存,直到socat连接。在调用fread()之前不会传输任何数据。我试过用linux" pv"来限制转移。效用

pv -L 10m file.bin | socat -u - TCP4:127.0.0.1:50000

无效。

我的问题是:字节在哪里,或者我接下来要测试什么?

(编辑包括进一步的测试结果): 输出到文件是不必要的,即fwrite()调用。执行t = test更容易,更快,等待传输完成,即socat客户端返回,然后查询从Matlab内传输的总字节数:

t.BytesAvailable + t.ValuesReceived

在我的Windows计算机上,此值始终小于文件大小2139160576字节。在我的Ubuntu机器上,偶尔值等于。此外,当他们不等同时," netstat -s"重新传输的段和丢弃的数据包不会改变。对环回接口的Wireshark监控显示最终的Matlab /服务器ACK序列号为2139160578.据推测,由于服务器和客户端递增1,因此文件大小超过2个。

*另外,Matlab的仪器控制工具箱fread实现是一个糟糕的包装,我无法看到低级代码。 matlab \ toolbox \ shared \ instrument \ @icinterface \ fread.m,函数localFormatData,LINE 296.所有数据类型都显式转换为带数字类型转换的double。这会导致大量的CPU负载,更不用说数据类型之间的有损转换。

0 个答案:

没有答案