答案 0 :(得分:2)
将现有套接字重新连接到新服务器所需的最小工作是什么?
无限。这是不可能的。
是否可以将sock作为具有不同对等地址的subsequenet connect()的参数重用?
没有。调用connect()
后,即使失败,也无法重新连接TCP套接字。您必须关闭它并创建一个新的套接字。一个原因是如果套接字没有绑定,connect()
绑定它,并且根据到目的地的IP路由选择绑定,这对于第二个目的地可能不相同。
虽然第二个connect()返回0
难以置信。你确定吗?
我尝试连接的第二个对等体永远不会从
listen()
返回。
listen()
没有阻止。你的意思是accept()
?
知识渊博的回答者可以解释这里出现问题的本质吗?
再次,你必须指accept()
,而且很难相信第二个connect()
返回零。 connect()
应该在errno == EISCONN
(或Windows上为WSAGetLastError() == WSAEISCONN
)时返回-1。
编辑但是,在非阻塞套接字上第二次调用connect()
用于检测第一个connect()
是否已完成。这项技术在所有旧书中都有,但现在我们SO_ERROR
正确的方法是检查getsockopt(SO_ERROR)
是否有EAGAIN
/ EWOULBLOCK
来自第一个connect()
}}。当您收到来自select()
的写入通知或来自(e)poll()
的写入或错误通知时,您会执行这些检查。所以在你的情况下发生的一切是第二个connect()
确认了第一个connect()
的成功,并忽略了不同的目标地址/端口。
0返回值应该表示成功,那么为什么对等体
listen()
永远不会解除阻塞?
无论外观如何,第二个connect()
都失败了,所以服务器没有理由做任何事情,更不用说从accept()
返回了。
我可以做些什么来重用sock来连接第二个对等体?
没有
或者第二次connect()是否必须使用socket()新创建的套接字完成?
是
答案 1 :(得分:2)
是否可以将
sock
作为参数重新使用具有不同对等地址的子结构connect()
?
对于TCP套接字,不可能(对于UDP套接字,它是允许的)。 TCP套接字关闭后,无法重用。每次socket()
来电时,您需要另外connect()
来电。
然而,仅在Windows上,SOCKET
(来自socket()
或WSASocket()
)可以重复使用,但仅它使用DisconnectEx()
关闭,dwFlags
参数设置为TF_REUSE_SOCKET
。然后,SOCKET
可以传递给ConnectEx()
(或AcceptEx()
)。