Octave套接字包,如何接收大数据流

时间:2017-05-22 15:04:01

标签: sockets octave

我仍然遇到Octave的问题。我需要通过Web套接字连接接收大(> 10M)图像,处理数据并将其发回。我在Windows 7中使用Octave 4.2.1,套接字包是版本1.2.0,可以在这里找到:https://octave.sourceforge.io/sockets/

以下是最小代码示例:

pkg load sockets;

rcv_sck=socket(AF_INET, SOCK_STREAM, 0); 
bind(rcv_sck,12345);
a=listen(rcv_sck,0);
b=accept(rcv_sck);

data = [];
bufflen = 4600;

total = 0;
count = 0;

while (total < 10000)
    [buff,count]=recv(b, bufflen);
    data = horzcat(data, buff);
    total += count;
endwhile

disconnect (b);
disconnect (rcv_sck);

fileID = fopen('data.jpg','w');
fwrite('data.jpg', data);
fclose(fileID);
imshow ('data.jpg')

可以使用netcat进行测试

  

ncat.exe 127.0.0.1 12345&lt; test.jpg放在

我的问题是,我无法接收大于4608字节的数据。如果我发送更多数据,接收阵列将被切割为此大小。这就是我选择4600字节作为缓冲区长度的原因。现在我尝试将大块的小数据块放在一起以获得正确的数据。

但这有两个严重的问题:

1)我必须知道我发送的数据的大小,这个问题可以通过首先将大小作为参数发送来解决。在我的例子中,我将大小设置为10000字节。

2)更重要的是:它非常慢。对于170kB的jpeg,发送数据需要7秒钟。

非常感谢任何提示或提示,谢谢。

1 个答案:

答案 0 :(得分:0)

如果您想要在断开连接之前读取数据,我建议

data = recv (b, Inf, MSG_WAITALL);

没有任何循环或horcat。在您的客户端(netcat)使用-q0:

netcat.exe -q0 localhost 12345 < test.jpg

顺便说一下,如果你想将它存储在服务器端,为什么不使用

system ("netcat -l -p 12345 > data.jpg");

首先?