同一端口套接字C ++上的多个连接
Posted
技术标签:
【中文标题】同一端口套接字C ++上的多个连接【英文标题】:Multiple connections on the same port socket C++ 【发布时间】:2012-05-23 15:44:21 【问题描述】:我需要接受到同一个端口的多个连接。 我在 C++ 中使用套接字,我想做一些类似于 SSH 的事情。 我可以执行 ssh user@machine "ls -lathrR /" 并在同一台机器上运行另一个命令,即使第一个命令仍在运行。
我该怎么做?
谢谢。
【问题讨论】:
如果不是为了理解socket编程,我建议不要使用纯socket。而是使用网络框架。 ACE 或 ZeroMQ。最初,做 vanilla socket 看起来是个好主意,但随着时间的推移它会变得混乱。 我尝试在另一个线程中再次监听端口,但没有成功,它说端口正在使用中所以我问了;) 您无需做任何特别的事情。你还在听,所以不要再试听了。 我在接收数据时尝试再次监听同一个端口,但收到无法绑定端口的问题 你为什么要再试听一次?你已经在听了。当然,您不能将该套接字绑定到该端口——您已经有一个绑定到该端口的套接字。 (除非您关闭它,在这种情况下,不要这样做。) 【参考方案1】:你想要的是一个多线程套接字服务器。
为此,您需要一个主线程来打开一个套接字来监听(并等待传入的客户端连接)。这必须进入某种while循环。
然后,当客户端连接到它时,accept()
函数将解除阻塞,此时您需要通过将请求传递给将处理它的线程来服务客户端请求。
服务器端将循环返回并等待另一个连接,同时前一个线程继续其任务。
您可以根据需要创建线程,也可以使用效率更高的线程池(节省初始化新线程的时间)。
查看here 了解更多详情。
在网络上查找多线程服务器套接字,特别是服务器端的bind()
、listen()
和accept()
。
【讨论】:
我试试看,因为如果我想连接它说地址已经在使用中。 如果您尝试绑定到已被另一个应用程序使用的端口,则可能会发生这种情况。正在尝试监听哪个端口? 我需要 2 个应用程序将数据发送到同一个端口,就像 ssh 在您同时发送多个命令时所做的那样。 @November,如果你所说的线程是指处理连接数据的函数,那么accept()
进入主线程。在accept()
调用之后,您可以启动新线程来处理该特定连接。请参阅en.wikipedia.org/wiki/… 了解一些例子。【参考方案2】:
您需要阅读::listen()
和::accept()
。
前者将设置您的套接字进行侦听。然后你需要一个循环(可能在它自己的线程中),它使用::accept()
,每次新连接到达时都会返回。
然后,该循环应该生成一个新线程,您应该将从::accept()
接收到的文件描述符传递给该线程,然后从那里处理该套接字上的所有 I/O。
【讨论】:
【参考方案3】:老问题已经老了,但我觉得回答的人都没有理解 OP 的问题。
您误解了 ssh 的工作原理。当您通过 ssh 向服务器发送多个命令/多个连接时,实际上您要连接的服务器上只有一个程序正在接收所有这些命令。
Sshd(ssh 守护进程)在服务器上运行,是一个多线程套接字服务器(参见 fduff 的回答)。这是唯一侦听端口 22 并自行处理所有传入 ssh 连接的程序。
【讨论】:
以上是关于同一端口套接字C ++上的多个连接的主要内容,如果未能解决你的问题,请参考以下文章