【问题标题】:Octave Sockets Package, how to receive large data streamsOctave Sockets Package,如何接收大数据流
【发布时间】:2017-05-23 02:16:06
【问题描述】:

我仍然有 Octave 的问题。我需要通过网络套接字连接接收大(> 10M)图像,处理数据并将其发回。我在 Windows 7 中使用 Octave 4.2.1,sockets 包的版本是 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

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

但这有两个严重的问题:

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

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

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

一月

【问题讨论】:

    标签: sockets octave


    【解决方案1】:

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

    data = recv (b, Inf, MSG_WAITALL);
    

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

    netcat.exe -q0 localhost 12345 < test.jpg
    

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

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

    首先?

    【讨论】:

    • 非常感谢!我找不到任何相关信息。效果很好。
    • 您现在正在使用这两种解决方案中的哪一种?
    • netcat.exe -q0 localhost 12345
    • 不,我当然要求的是服务器端。我提出了两个使用 octave-sockets (data = recv (b, Inf, MSG_WAITALL)) 的解决方案和一个使用 system ("netcat -l -p 12345 &gt; data.jpg"); 的解决方案,它可以在没有 octave-sockets 的情况下使用
    • 即使有点晚了,澄清一下我使用八度音阶解决方案。它运行良好,并在大型生产设施中使用。您的其他想法无法使用。再次感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多