2016-05-03 38 views
1

假设我有一个基本的C#套接字服务器。c#套接字检查传入连接并且一次只接受一个连接

TcpListener listener = new TcpListener(8888); 
listener.Start(); 

Socket clientSocket = listener.AcceptSocket(); 

这将接受来自客户端的第一个连接。

但是,假设我们有10个传入连接。我不希望接受全部10个连接,我想列出所有未决连接,并选择一个连接,我将接受并与其交换数据 - 我们可以假设我可以通过其IP地址识别它们。交换完成后,我将关闭套接字并选择不同的连接来交换数据。
我不需要有超过1个活动连接,因为我一次只能服务一个客户端。

这样的壮举可能吗?或者我是否必须接受所有这些方法,并通过他们来解决问题?

编辑:客户端超时不是一个问题。客户端编程为在超时情况下定期重试连接。

EDIT2:
我设法相当多的搜索后发现了类似的问题。看起来你不能区分客户,直到你接受他们的连接。这里的问题:
How to reject a connection attempt in c#?
我想我至少可以告诉连接企图来自哪个IP地址,但它似乎是不可能的,直到我连接到客户端。看起来我毕竟会穿过客户端。

+0

您可以通过接受然后关闭连接来完成此操作,但如果您无法及时找到,等待的连接最终会超时。 – nhouser9

+0

@ nhouser9客户端被编程为在超时后重试连接尝试,所以这对我来说不是问题。我将编辑这个问题来澄清。 – xIcarus

+0

然后除了性能之外没有真正的问题 - 如果服务器执行冗长的计算,您的客户可能会等待相当长的一段时间。但是,否则,没有任何东西阻止您接受连接,关闭连接并接受新的连接。 – nhouser9

回答

0

您不接受所有连接,只有一个。您只需执行AcceptSocket,处理您的客户端,然后断开并接受另一个客户端,例如在while(listener.Pending())循环中。

+0

是的,但是这让我无法控制与我交互的客户端。如果不是我想要的客户端,我可以接受连接并将其关闭,但是这可能会导致同一台计算机反复连接的严重问题。为了让你明白,这些客户端是我的机器,正在等待我与他们交换数据。我想一次发送一条指令给他们。机器知道我的IP,我不知道他们的IP,我不能保证他们的路由器让他们充当服务器(端口转发或DMZ)。这就是为什么我需要成为服务器,他们需要成为客户。 – xIcarus

+0

“不是你想要的客户”什么阻止你在客户端连接时为客户提供服务? – Adrian

+0

事实上,我不需要刚刚连接的客户端。如果我没有把我的问题弄清楚,我非常抱歉。看 - 一个正常的方法是接受所有10个客户端(从我的例子),并写入其中的一个。就像一个信使,但只在客户端和服务器之间。我问是否有可能避免维护这10个并发连接,并接受其中的一个 - 我需要的客户端(机器)。 – xIcarus