【问题标题】:Python Socket TCP receiver does not ACK correctly NoOS LWIP senderPython Socket TCP 接收器未正确确认 NoOS LWIP 发送器
【发布时间】:2019-09-10 16:37:12
【问题描述】:

我正在尝试在我的 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

请问有什么有用的提示吗?目前我正在尝试找到类似的已解决问题..

【问题讨论】:

    标签: tcp wireshark lwip


    【解决方案1】:

    我找到了解决方法:

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

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

    但是,'\0' 也可能是数据包最后的值(尤其是 当 TCP ACK 时)。我自动抛出了这个空值,而 LWIP 不能 将此作为有效数据包处理。所以现在,我传递了整个数据包数组 并让 LWIP 自行处理...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 2019-11-27
      • 1970-01-01
      • 1970-01-01
      • 2021-06-13
      • 2016-07-20
      相关资源
      最近更新 更多