tcp_poll回调函数自己关闭了tcp连接,lwip还会轮询调用回调函数吗
时间: 2023-08-15 18:08:28 浏览: 243
如果`tcp_poll`回调函数自己关闭了TCP连接,lwIP将不再继续轮询调用该回调函数。具体来说,当`tcp_poll`回调函数返回错误码`ERR_ABRT`时,lwIP会立即关闭TCP连接,并且不会再调用该回调函数。
因此,在`tcp_poll`回调函数中手动关闭TCP连接后,应用程序不必再处理该连接的任何事件。但是需要注意的是,应用程序需要确保在回调函数中手动关闭TCP连接时,不会出现资源泄漏或错误的情况。比如,在关闭TCP连接之前需要确保已经释放所有与该TCP连接相关的资源,如缓冲区、定时器等。
相关问题
lwip_tcp_server_connection_close可以在tcp_poll回调函数中调用吗
不建议在`tcp_poll`回调函数中调用`lwip_tcp_server_connection_close()`函数关闭TCP连接。因为,`tcp_poll`回调函数是在轮询过程中被调用的,它的执行时间是不确定的,可能会引起竞态条件,从而导致应用程序出现不可预期的错误。
通常情况下,建议在TCP连接关闭的事件处理函数中调用`lwip_tcp_server_connection_close()`函数。这些事件包括`ERR_RST`、`ERR_CLSD`、`ERR_ABRT`等。在这些事件中,lwIP已经关闭了TCP连接,并且不再轮询`tcp_poll`回调函数。
如果确实需要在`tcp_poll`回调函数中调用`lwip_tcp_server_connection_close()`函数,应该先停止轮询过程,然后再关闭TCP连接。具体来说,可以设置一个标志位或者调用`tcp_abort()`函数来停止TCP连接的轮询过程,然后在下一次轮询时关闭TCP连接。
总之,为了避免出现竞态条件和其他问题,建议在TCP连接关闭的事件处理函数中调用`lwip_tcp_server_connection_close()`函数,而不是在`tcp_poll`回调函数中调用。
tcp_poll回调函数关闭了tcp连接,但未返回ERR_ABRT,会出现什么情况
如果`tcp_poll`回调函数手动关闭了TCP连接,但未返回错误码`ERR_ABRT`,可能会出现以下情况:
1. lwIP仍然会继续轮询调用该回调函数。因为lwIP并不知道该TCP连接已经被关闭,所以仍然会调用`tcp_poll`回调函数来处理TCP连接的轮询事件。这可能会导致应用程序不必要的资源消耗。
2. 如果在回调函数中手动关闭TCP连接时,没有释放所有与该TCP连接相关的资源,可能会出现资源泄漏或错误的情况。比如,如果在手动关闭TCP连接之前没有清空缓冲区,可能会导致数据丢失或内存泄漏等问题。
因此,建议在`tcp_poll`回调函数中手动关闭TCP连接时,同时返回错误码`ERR_ABRT`,以便lwIP能够及时关闭TCP连接并回收资源。
阅读全文