Matlab套接字等待响应

 haodan1006 发布于 2023-02-14 00:02

我正在尝试在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');

我究竟做错了什么?看起来服务器不等待客户端发送任何东西来尝试读取数据,因此没有数据要读取(它等待客户端连接的想法).


Edit1: 好的,我现在正在发送字符,所以我们肯定知道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毫秒(较低的数字接缝)风险很大.

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

    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服务器客户端通信实现非常脆弱,需要大量的解决方法......

    2023-02-14 00:36 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有