gpt4 book ai didi

Matlab 套接字等待响应

转载 作者:太空宇宙 更新时间:2023-11-03 19:33:32 24 4
gpt4 key购买 nike

我正在尝试在 matlab 中运行以下客户端和服务器套接字示例代码: http://www.mathworks.com/help/instrument/using-tcpip-server-sockets.html

这是我的代码。

服务器:

t=tcpip('0.0.0.0', 9994, 'NetworkRole', 'server');
fopen(t);
data=fread(t, t.BytesAvailable, 'double');
plot(data);

客户:

data=sin(1:64);
t=tcpip('localhost', 9994, 'NetworkRole', 'client');
fopen(t);
fwrite(t, data, 'double');

事情是这样的:我运行服务器代码->程序等待来自客户端的连接->我运行客户端代码->在服务器控制台我得到:

Error using icinterface/fread (line 163)
SIZE must be greater than 0.

Error in socketTentativaMatlab (line 3)
data=fread(t, t.BytesAvailable, 'double');

我做错了什么?看起来服务器没有等待客户端发送任何东西来尝试读取数据,所以没有数据可读(它等待客户端连接思想)。


编辑1:好的,我现在发送字符,所以我们确定 t.BytesAvaiable = 元素数。

我已经能够通过以下方式成功同步接收(这是服务器代码,客户端代码是相同的但是我现在发送字符并在与服务器建立连接后暂停1秒):

t=tcpip('0.0.0.0', 30000, 'NetworkRole', 'server');
fopen(t);
data=strcat(fread(t, 1, 'uint8')');
if get(t,'BytesAvailable') > 1
data=strcat(data,fread(t, t.BytesAvailable, 'uint8')');
end
data

这是因为我怀疑 bytesAvaiable 是在尝试至少读取一次后剩余要读取的字节数……这看起来不太合乎逻辑,但显然是这样发生的。因为我必须至少读取一次才能知道消息有多少字节...我选择第一次只读取 1 个字节。然后我读剩下的东西,如果还有东西......

我可以在 matlab 进程之间完成这项工作,但我不能在 C++ 和 matlab 之间完成。 C++ 客户端成功连接到 matlab 服务器,并且可以毫无问题或错误地发送数据。但是,在 matlab 服务器端,我无法读取它。

所有这些 matlab tcpip 实现似乎都有问题!


编辑2:如果我正确地关闭客户端和服务器中的所有套接字(基本上不要让程序在打开套接字的情况下退出),上面的代码接缝可以一致地工作。我转到控制台并键入“netstat”以查看所有连接...事实证明,由于我要打开套接字,一些连接处于 FIN_WAIT_2 状态,这显然使这些连接的端口不可用。最终连接肯定会超时,但这需要一分钟或更长时间,因此,最好的做法是确保套接字始终正确关闭。

我不明白 t.BytesAvaiable 背后的逻辑是什么……它看起来并没有多大意义。如果我循环并等待它变得大于 0,它最终会发生,但这不是同步套接字应该有的方式。我的代码允许一个人同步做事,即使我不明白为什么第一次没有正确设置 t.BytesAvaiable。

最终服务器代码:

t=tcpip('0.0.0.0', 30000, 'NetworkRole', 'server');
fopen(t);

data=strcat(fread(t, 1, 'uint8'));
if get(t,'BytesAvailable') > 1
data=strcat(data,fread(t, t.BytesAvailable, 'uint8')');
end

fclose(t);

最终客户端代码:

您典型的套接字客户端,以任何语言实现,但您必须确保在连续调用 send() 方法/函数之间(或调用 connect() 和 send() 之间)至少 100 毫秒(较小的数字接缝是有风险的)被淘汰了。

最佳答案

你是对的,服务器似乎并没有在等待客户端,即使默认的通信模式是同步的。您可以自己实现等待,例如通过插入

while t.BytesAvailable == 0
pause(1)
end

在阅读之前。

但是,我发现还有更多问题——来自 MathWorks 站点的代码如此糟糕很奇怪——即 t.BytesAvailable 给出了字节数,而 fread 需要多个值,因为一个 double 值需要 8 个字节,所以它必须说

data=fread(t, floor(t.BytesAvailable / 8), 'double');

此外,如果客户端在打开连接后立即写入数据,我发现服务器会忽略它们。我能够通过在客户端代码中插入一个 pause(1) 来解决这个问题,就像这样

data=sin(1:64);
t=tcpip('localhost', 9994, 'NetworkRole', 'client');
fopen(t);
pause(1)
fwrite(t, data, 'double');

我的印象是,Matlab 实现的 TCP/IP 服务器客户端通信非常脆弱,需要大量变通方法...

关于Matlab 套接字等待响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20271970/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com