我想更改套接字正在监听的端口。问题是只要对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/