Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab TCP-IP服务器无损传输_Matlab_Tcp - Fatal编程技术网

Matlab TCP-IP服务器无损传输

Matlab TCP-IP服务器无损传输,matlab,tcp,Matlab,Tcp,我曾尝试在Matlab中实现一个“无损”的TCP侦听服务器,但失败了。所谓无损,我指的是使用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

我曾尝试在Matlab中实现一个“无损”的TCP侦听服务器,但失败了。所谓无损,我指的是使用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' );
t.BytesAvailable + t.ValuesReceived
我已经对此进行了很好的测试,并且在传输速率(没有文件的fwrite和use/dev/zero,它会使千兆链路饱和)和低cpu负载方面取得了不错的成功。诀窍是绕过Matlab的tcpip()默认包装器*,通过以下方式访问较低级别的方法:

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

Socat->Socat传输工程(显然)

Socat->我的matlab代码保持在fopen(),直到Socat连接。在调用fread()之前,不会传输任何数据。我已尝试使用linux“pv”实用程序限制传输:

毫无效果

我的问题是:字节将去哪里,或者下一步我应该测试什么

(编辑以包括进一步的测试结果): 输出到文件是不必要的,即fwrite()调用。执行t=test,等待传输完成,即socat客户端返回,然后在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' );
t.BytesAvailable + t.ValuesReceived
在我的Windows计算机上,此值始终小于2139160576字节的文件大小。在我的Ubuntu机器上,有时值相等。此外,当它们不相等时,重新传输的“netstat-s”段和丢弃的数据包不会改变。环回接口的Wireshark监控显示最终的Matlab/server ACK序列号为2139160578。据推测,由于服务器和客户端都增加了1,因此比文件大小多了2


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

您能解释一下这行代码:
fwrite(fid,x(1),'int8')?为什么只写第一个字节?'jobect'fread方法返回一个大小为3的java.lang.Object。其第一个字段?即x(1)是读取的数据。第二个字段是读取数据的大小。它的第三个字段是anymessages。