我已经尝试过并且未能在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负载,更不用说数据类型之间的有损转换。