是否可以在任何常见平台(例如 Windows)中编写一个服务进程来创建套接字,将其绑定到一个本地“地址:端口”(固定),然后:
即(抱歉语法滥用):
mySocket=socket(); mySocket.bind(myaddress, 3000); mySocket.connectTo(neighbour, whateverport); // 并作为端口 3000 呈现给其他人 mySocket.listen(); // 它监听 3000 mySocket.accept();
?
iirc,甚至在 API 不会抱怨的情况下,甚至不可能/不建议尝试,但也许是我太按书本行事了……所以我想问你
非常感谢!
不可以,一个套接字不能同时用于监听和连接。如果
connect()
已经被调用,WSAEINVAL
将返回 listen()
错误,如果 listen()
已经被调用,WSAEISCONN
将返回 connect()
错误。您需要使用单独的插座。
如果可以的话,就会出现各种各样的麻烦。例如,如果 select() 返回套接字可读,那么您执行 recv() 还是accept()?您需要 2 个套接字来扮演这两个角色。
一个插座有什么优势?例如,如果您希望执行阻塞读取,直到发生有趣的事情(传入连接、传入数据),那么还有其他选择。在该示例中,您将使用 select() 同时阻止两个套接字。 select() 的结果告诉您哪个套接字已准备好。这告诉您是否要从一个套接字接受()新连接或从另一个套接字接收()新数据。