TCP:是否可以绑定一个套接字,然后/两者/从它连接并从它接受(客户端和服务器规则)?

问题描述 投票:0回答:2

是否可以在任何常见平台(例如 Windows)中编写一个服务进程来创建套接字,将其绑定到一个本地“地址:端口”(固定),然后:

  • 用它来监听传入连接(在指定端口上) 而同时
  • 将其用作客户端套接字来连接到其他某个服务(具有与其公开给其他人的源端口相同的源端口)?

即(抱歉语法滥用):

mySocket=socket(); mySocket.bind(myaddress, 3000); mySocket.connectTo(neighbour, whateverport); // 并作为端口 3000 呈现给其他人 mySocket.listen(); // 它监听 3000 mySocket.accept();

iirc,甚至在 API 不会抱怨的情况下,甚至不可能/不建议尝试,但也许是我太按书本行事了……所以我想问你

非常感谢!

sockets tcp port listen
2个回答
2
投票

不可以,一个套接字不能同时用于监听和连接。如果

connect()
已经被调用,
WSAEINVAL
将返回
listen()
错误,如果
listen()
已经被调用,
WSAEISCONN
将返回
connect()
错误。您需要使用单独的插座。


2
投票

如果可以的话,就会出现各种各样的麻烦。例如,如果 select() 返回套接字可读,那么您执行 recv() 还是accept()?您需要 2 个套接字来扮演这两个角色。

一个插座有什么优势?例如,如果您希望执行阻塞读取,直到发生有趣的事情(传入连接、传入数据),那么还有其他选择。在该示例中,您将使用 select() 同时阻止两个套接字。 select() 的结果告诉您哪个套接字已准备好。这告诉您是否要从一个套接字接受()新连接或从另一个套接字接收()新数据。

© www.soinside.com 2019 - 2024. All rights reserved.