我正在尝试在两个stm32设备之间进行TCP连接。首先,我们在wireshark上看到的行之间一切都是完美的,当TCP客户端重置并尝试发送新数据时,wireshark显示给我重传TCP消息,但当我调试服务器端时,服务器端得到消息,在客户端收到此回显消息后发送回显消息。
为什么重传的消息显示,即使我得到并发送消息给对方?
客户端完整代码:https://paste.ubuntu.com/p/vjhzgv29fm/
/**
* @brief Initializes the tcp echo server
* @param None
* @retval None
*/
void tcp_echoserver_init(void)
{
/* create new tcp pcb */
tcp_echoserver_pcb = tcp_new();
if (tcp_echoserver_pcb != NULL)
{
err_t err;
/* bind echo_pcb to port 7 (ECHO protocol) */
err = tcp_bind(tcp_echoserver_pcb, IP_ADDR_ANY, 7);
if (err == ERR_OK)
{
/* start tcp listening for echo_pcb */
tcp_echoserver_pcb = tcp_listen(tcp_echoserver_pcb);
/* initialize LwIP tcp_accept callback function */
tcp_accept(tcp_echoserver_pcb, tcp_echoserver_accept);
}
else
{
/* deallocate the pcb */
memp_free(MEMP_TCP_PCB, tcp_echoserver_pcb);
}
}
}
/**
* @brief Connects to the TCP echo server
* @param None
* @retval None
*/
void tcp_echoclient_connect(void)
{
ip_addr_t DestIPaddr;
/* create new tcp pcb */
echoclient_pcb = tcp_new();
if (echoclient_pcb != NULL)
{
IP4_ADDR(&DestIPaddr, (uint8_t)192, (uint8_t)168, (uint8_t)1, (uint8_t)40);
/* connect to destination address/port */
tcp_connect(echoclient_pcb,&DestIPaddr,7,tcp_echoclient_connected);
}
else
{
SerialPrint("not null");
memp_free(MEMP_TCP_PCB, echoclient_pcb);
}
}
在使用wireshark分析网络流时,这里有一个来自wireshark的文档,可以帮助您理解这些词的含义。
我们可以看到下面这件事:
TCP重传
下一个预期序号大于当前序号。
对于您的情况,问题是段长度大于零或者SYN或FIN标志被设置。这是由您的重置引起的,所以这并不意味着您的TCP连接引起了重传。
介绍 TCP的主要任务是很简单:打包和发送数据。TCP与其他协议的不同之处在于使用滑动窗口来管理基本数据收发过程,同时确保数据流的有效及可靠传输,从而不致发送速率明显快于接收速率。本文将描述TCP是如何确保设备可靠、有效地进行传输的。首先阐述TCP检测丢失片段以及重传的基本方法,之后介绍TCP如何判断一个片段为丢失片段。 更多信息 TCP片段重传计时器以及重传队列: 检测丢失片段并对之重传的方法概
介绍 TCP发送一个或一组报文,会等待收到报文的确认信息。重传,即发生在报文没有到达或确认信息没有及时返回的情况下。当发现网速变慢时,原因之一可能就是重传。发生重传的原因有多种,在客户机或服务器两边端口应用Wireshark有助于诊断问题。本文通过抓包实例阐述各种可能性。 更多信息 诊断过程: 在相应端口开始抓数据。 找到Analyze | Expert Info菜单。 在Notes之下,查找Re
我试图获得覆盖数据远程与Jacoco代理和重置服务器上的执行信息重置=真; java代理在服务器上: 本地计算机上的Ant任务: 我的问题是在重置执行信息后,我得到转储。如果我在服务器上做一些操作,然后两次调用我的蚂蚁目标“get_data”,在两次执行之间删除test_data.exec文件,我会得到相同的覆盖数据。所以重置=true似乎不起作用。 我怎么能让Jacoco重置coverega数据
swoole所有监听的TCP端口都是在管理进程创建完毕之后才开始监听的,所以worker进程中并没有TCP的server socket。 而UDP是在管理进程创建前就开始监听,所以worker进程中是持有UDP server_socket的。 启动的顺序是: 启动主进程 php启动时,即创建了主进程。当swoole_server->start前会创建所有worker进程IPC的unix socke
TcpObject { "header": { "type": "none" } } header: NoneHeaderObject | HttpHeaderobject 数据包头部伪装设置,默认值为NoneHeaderObject。 NoneHeaderObject 不进行伪装 { "type": "none" } type: "none" 指定不进行伪装 HttpHe
tcp 服务器由两个类组成,一个是tcp_server,另一个是它的子类tcp_threading_server。 先看代码: #include <mongols/tcp_server.hpp> #include <mongols/tcp_threading_server.hpp> int main(int,char**) { auto f=[](const std::pair<cha