同一端口套接字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 ++上的多个连接的主要内容,如果未能解决你的问题,请参考以下文章

在 C 或 C++ 中的同一个套接字上同时读取和写入

socket 编程中 accept 函数返回

Linux 套接字与文件描述符

简单服务器开发Socket 编程

python/socketserver

Windows 上的 C 中的套接字编程(服务器、使用 select() 和 fd_set 的多线程)