2012-05-23 78 views
5

我需要接受到同一端口的多个连接。 我在C++中使用套接字,我想做一些类似SSH的事情。 我可以做一个ssh user @ machine“ls -lathrR /”并且运行另一个命令到同一台机器,即使第一个仍在运行。同一端口套接字上的多个连接C++

我该怎么做?

谢谢。

+0

如果不是理解套接字编程,我建议不要使用普通套接字。而是使用网络框架。 [ACE](http://www.cs.wustl.edu/~schmidt/ACE-overview.html)或[ZeroMQ](http://www.zeromq.org/)。最初做香草套筒看起来是一个好主意,但随着时间的推移会变得混乱。 – Vikas

+0

我试图在另一个线程中再次监听端口,但它没有工作,它说端口正在使用,所以我问;) – Lefsler

+0

没有什么特别的你需要做的。你还在听,所以不要再试听。 –

回答

10

你想要的是一个多线程套接字服务器。

为此,您需要一个主线程打开一个套接字来侦听(并等待传入​​的客户端连接)。这必须进入某种类型的while循环。

然后,当一个客户端连接到它时,accept()函数将解除阻塞,并且此时您需要通过将请求传递给将处理该请求的线程来为客户端请求提供服务。

服务器端将回退并等待另一个连接,而上一个线程继续执行其任务。

您可以根据需要创建线程,也可以使用可能更高效的线程池(节省时间来初始化新线程)。

看看here了解更多的细节。 在Web上查找多线程服务器套接字,特别是从服务器端的bind(),listen()accept()

+0

我会尝试它,因为如果我想连接它说地址已经在使用。 – Lefsler

+0

如果您尝试绑定到其他应用程序已在使用的端口,则可能会发生这种情况。什么港口试图聆听? – fduff

+0

我需要2个应用程序将数据发送到同一端口,就像ssh在同时发送多个命令时一样。 – Lefsler

1

您需要阅读::listen()::accept()

前者将设置您的套接字进行收听。然后你需要一个循环(可能在它自己的线程中),它使用::accept(),每次新连接到达时都会返回。

该循环应该产生一个新的线程,您应该传递从::accept()收到的文件描述符,然后处理该套接字上的所有I/O。

0

旧的问题是旧的,但我觉得没有人回答了解OP的问题。

你误解了ssh的工作原理。当你通过ssh发送多个命令/多个连接到服务器时,实际上你连接的服务器上只有一个程序正在接收所有这些命令。

Sshd(ssh守护进程)在服务器上运行,并且是一个多线程套接字服务器(请参阅fduff的回答)。这是在端口22上侦听的唯一程序,并且它自己处理所有传入的ssh连接。

+0

感谢Conslo,但我已经在几个月前解决了这个问题。 – Lefsler

相关问题