sockets - 调用accept()后如何更改套接字的监听端口?

标签 sockets freertos lwip

我想更改套接字正在监听的端口。问题是只要对accept()的调用仍在进行中我就无法做到这一点。我尝试关闭套接字,期望accept()退出并返回负值。但在 FreeRTOS 上不会发生这种情况。当我从不同线程关闭套接字时,accept() 仍然执行。我想出的唯一解决方法是在变量中设置一个标志,建立一个 TCP 连接,然后当accept()完成时,检查标志,用新端口绑定(bind)()并调用listen()。但也许有更优雅的方法?

最佳答案

I'd like to change the port a socket is listening on.

你不能。您必须关闭当前的监听套接字,然后打开一个新的监听套接字。

The problem is that I can't do it as long as a call to accept() is still in progress.

您必须先取消阻止accept(),然后才能关闭监听套接字。

I tried closing the socket

这是实现该要求的正确方法,但它并不构成更改套接字正在监听的端口。您必须创建一个新的套接字来监听新端口。

我将创建新套接字并使其投入运行,并设置一个标志,表示不再接受旧套接字上的任何进一步连接:当旧套接字上的 accept() 最终解除阻塞时,检查标志,如果设置了,则关闭已接受的连接和旧的监听套接字,并退出该接受循环和线程。

这是一个奇怪的要求。目的是什么?

关于sockets - 调用accept()后如何更改套接字的监听端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25293046/

相关文章:

c - 海湾合作委员会 C 错误 : expected ')' before numeric constant

multithreading - 使用 netconn 同时处理多个 LwIP 连接

node.js - Socket.io 连接恢复轮询,从不触发 'connection' 处理程序

python - 如何在 Python 中使用原始套接字?

c - FreeRTOS 任务不是上下文切换

c - 为什么我在 FreeRTOS 中出队时得到一个空指针?

c - lwip 堆栈 netconn api 保持连接 "keep-alive"

c# - 写入文件仅在 "step in" Debug模式下有效?

java - 具有公共(public) IP 地址的 DatagramSocket

c++ - FreeRTOS+STM32F4+CPP调用vTaskDelay时卡住