Python Socket TCP接收器无法正确确认NoOS LWIP发送器

时间:2019-04-20 22:18:42

标签: tcp wireshark ack lwip

我正在尝试在PC和LWIP MCU之间建立TCP通信。 LWIP UDP和ICMP似乎可以正常工作。请注意,LWIP充当TCP发送者,而基于PC-Python套接字的脚本充当接收者。第一次循环连接接受似乎已正确确认。但是,在TCP数据包发送期间,PC ACK似乎不正确-LWIP重新发送了数据包。

LWIP代码发送方看起来像这样(明显的LWIP_Process函数用于处理接收到的数据包和刷新时间,MCU的初始化不是 显示...。)

static char first_pld[32] = {"Thank you people"};
/* -----------Set network id ----------*/
IP4_ADDR(&ipaddr, 192u, 168u, 100u, 2u);
IP4_ADDR(&ipaddr_pc, 192u, 168u, 100u, 10u);
/* -----------Force ARP discover routine ----------*/
LWIP_arp_query(&ipaddr_pc);
LWIP_Process();
/* -----------Start TCP communication ----------*/
MyTCP = tcp_new();
LWIP_Process(); 
tcp_bind(MyTCP, &ipaddr, 504);
LWIP_Process();
tcp_connect(MyTCP, &ipaddr_pc, 504, MyConnectedFn);
LWIP_Process();
tcp_sent(MyTCP, MySentFn);
LWIP_Process();
printf("TCP available to send: %04d\r\n", 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 个答案:

答案 0 :(得分:0)

我找到了解决该问题的方法:

创建LWIP netinterface.c / h文件时要小心。

因为我想优化传递的缓冲区的长度( 框架)我创建了函数来收缩数组,包括(有时) 大量的“ \ 0”字符。我这样做是因为我的MAC PHY设备 在接收模式下不能返回小于60个字节的数据包数组, 因此,例如ARP帧(通常长度为42)填充为空 到底。

但是,“ \ 0”也可能是最后一个数据包的值(尤其是 TCP ACK时)。我自动将这个null丢了,LWIP无法 将其作为有效数据包处理。所以现在,我传递整个数据包数组 然后让LWIP自己处理...