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

时间:2011-08-25 14:17:34

标签: sockets tcp port connect listen

是否可以在任何通用平台(例如,在Windows中)编写一个创建套接字的servient进程,将其绑定到一个本地“address:port”(固定),然后:

  • 用它来监听传入的连接(在指定的端口上) 而同时
  • 使用它作为客户端套接字连接到其他一些服务器(源端口与它暴露给他人的端口相同)?

那是(抱歉语法滥用):

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

iirc,甚至在API不会抱怨的情况下甚至不可能/可取,但也许是因为我在书上玩了太多...所以我想问你

非常感谢!

2 个答案:

答案 0 :(得分:2)

不,套接字不能同时用于收听和连接。如果已调用connect()WSAEINVAL将返回listen()错误,如果已调用listen()WSAEISCONN将返回connect()错误。您需要使用单独的套接字。

答案 1 :(得分:2)

如果可以的话,会出现各种各样的麻烦。例如,如果select()返回套接字是可读的,你会执行recv()或accept()吗?你想要2个插座来扮演这两个角色。

一个插座有什么优势?例如,如果您希望在发生一些有趣的事情(传入连接,传入数据)之前进行阻塞读取,则有其他选择。在该示例中,您将使用select()一次阻塞两个套接字。 select()的结果告诉您哪个套接字已准备就绪。这告诉您是否要接受()来自一个套接字的新连接或recv()来自另一个套接字的新数据。