#tcp #wireshark #lwip
#tcp #wireshark #lwip
Вопрос:
Я пытаюсь установить TCP-связь между моим ПК и LWIP MCU. Кажется, что LWIP UDP и ICMP работают правильно. Обратите внимание, что LWIP работает как отправитель TCP, а сценарий на основе сокета PC-Python в качестве получателя. Кажется, что первое циклическое соединение accept подтверждено правильно. Однако во время отправки TCP-пакета кажется, что подтверждение ПК неверно — LWIP повторно передает пакет.
Сторона отправителя кода LWIP выглядит следующим образом (очевидная функция LWIP_Process для обработки полученных пакетов и времени обновления, инициализация MCU не показана ….)
static char first_pld[32] = {"Thank you people"};
/* -----------Set network id ----------*/
IP4_ADDR(amp;ipaddr, 192u, 168u, 100u, 2u);
IP4_ADDR(amp;ipaddr_pc, 192u, 168u, 100u, 10u);
/* -----------Force ARP discover routine ----------*/
LWIP_arp_query(amp;ipaddr_pc);
LWIP_Process();
/* -----------Start TCP communication ----------*/
MyTCP = tcp_new();
LWIP_Process();
tcp_bind(MyTCP, amp;ipaddr, 504);
LWIP_Process();
tcp_connect(MyTCP, amp;ipaddr_pc, 504, MyConnectedFn);
LWIP_Process();
tcp_sent(MyTCP, MySentFn);
LWIP_Process();
printf("TCP available to send: drn", tcp_sndbuf(MyTCP));
LWIP_Process();
tcp_write(MyTCP, first_pld, strlen(first_pld), 0);
LWIP_Process();
tcp_output(MyTCP);
LWIP_Process();
while (1) {
LWIP_Process();
}
}
Приемник Python:
import socket
import sys
import time
buff_size = 128
# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Bind the socket to the port
modbus_port = 504
this_addres = (b'192.168.100.10', modbus_port)
sock.bind(this_addres)
# Listen for incoming connections
sock.listen(1)
connection_status = 0
while connection_status == 0:
# Wait for a connection
print('waiting for a connection')
connection, client_address = sock.accept()
connection_status = 1
print("Connected to", client_address)
while 1:
payload = connection.recv(buff_size)
print(payload)
В журнале wireshark отображается сеанс ARP, принимающий TCP-соединение, но
Отправка TCP-пакета выглядит некорректно — LWIP повторно отправляет..
Изображение журнала Wireshark https://ibb.co/Q9fbxZ9
Пожалуйста, какой-нибудь полезный совет? В настоящее время я пытаюсь найти аналогичную проблему..
Ответ №1:
Я нашел решение, как это исправить:
Будьте осторожны при создании файлов LWIP netinterface.c / h.
Потому что я хотел оптимизировать длину передаваемых буферов (кадров) Я создал функцию для сжатия массивов, включающих (иногда) огромное количество символов ‘ 0’. Я сделал это, потому что мое устройство MAC PHY в режиме приема не может вернуть массив пакетов размером менее 60 байт, поэтому, например, кадр ARP (обычно длиной 42) в конце заполняется нулями.
Однако ‘ 0’ может быть также значением пакета в конце (особенно при подтверждении TCP). Я автоматически выбросил эти нули, и LWIP не смог обработать это как действительный пакет. Итак, теперь я передаю весь массив пакетов и позволяю LWIP обрабатывать его самостоятельно…