Я столкнулся со странной проблемой при обмене пакетами в моей реализации Python, которая использует AsyncIO StreamReaders/StreamWriters: я связал проблему с возможной настройкой различных флагов сокетов между библиотекой Java, встроенной в код MATLAB, и AsyncIO. -ориентированная реализация.
Конечно, исходная реализация получает ответ, в то время как в моей реализации на многие запросы просто не отвечают, на некоторые из них отвечают нормально.
Некоторые идеи:
- У меня есть доступ к входному буферу получателя, пакеты доставляются без проблем в обеих реализациях.
- Проверка трафика с помощью Wireshark показывает, что пакеты отправляются нормально (в версии Python пакеты также менее фрагментированы по сравнению с кодом MATLAB/Java), поэтому вероятность тайм-аута на принимающем устройстве из-за задержки + фрагментированные пакеты отброшены
- В исходном коде есть вызов метода
хотя реализация в JDK пуста (вздох), поэтому я считаю, что она совершенно бесполезна.
Какой совет? Я предполагаю, что должны быть какие-то настройки по умолчанию, которые я не могу идентифицировать, возможно, какие-то другие настройки сокетов TCP/IP, возможно, флаги или тайм-ауты.
EDIT: MRE было ( справедливо) запросил
Сначала пример версии MATLAB:
% yes, we're importing Java libs
import java.net.*;
import java.io.*;
TCPIP_LOCALPORT = 3000;
AcceptTimeOut = 1000; % 1 sec
boaObjects = [];
id = 1;
% PC acts a server
boaObjects(id).com.socket = [];
serverSocket = ServerSocket(TCPIP_LOCALPORT);
serverSocket.setSoTimeout(AcceptTimeOut);
cs = serverSocket.accept();
boaObjects(id).com.socket = cs;
boaObjects(id).com.socket.setSoTimeout(TCPIP_ACCEPTTIMEOUT); %set timeout
% Disable NAGLE algorithm
boaObjects(id).com.socket.setTcpNoDelay(1);
% Set preferences, but this method is not implemented in the JDK
boaObjects(id).com.socket.setPerformancePreferences(0,1,2);
% Open input and output streams
boaObjects(id).com.inStream = DataInputStream(boaObjects(id).com.socket.getInputStream());
boaObjects(id).com.outStream = DataOutputStream(boaObjects(id).com.socket.getOutputStream());
packet = [80, 00, 01, 02, 89, 80, 127];
% Write and send a message
boaObjects(id).com.outStream.writeBytes(char(packet));
boaObjects(id).com.outStream.flush();
% The receiveing device might get something like
% t = 0 -> 80
% t = 1 -> 00 01 02 89
% t = 2 -> 80 127
% but we still get an answer
response = [];
while(boaObjects(id).com.inStream.available())
response = [response, boaObjects(id).com.inStream.readByte()];
end
[responseLEN,~,errorCode]=parseHeader(response);
while(length(response)
Подробнее здесь: https://stackoverflow.com/questions/788 ... yncio-ones