Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#套接字检查传入连接,一次只接受一个连接_C#_Sockets - Fatal编程技术网

c#套接字检查传入连接,一次只接受一个连接

c#套接字检查传入连接,一次只接受一个连接,c#,sockets,C#,Sockets,假设我有一个基本的C#套接字服务器 TcpListener listener = new TcpListener(8888); listener.Start(); Socket clientSocket = listener.AcceptSocket(); 这将接受来自客户端的第一个连接 但是,假设我们有10个传入连接。我不希望接受所有10个连接,我希望有一个所有挂起连接的列表,并选择一个我将接受并与之交换数据的连接-我们可以假设我可以通过它们的IP地址识别它们。交换完成后,我将关闭套接

假设我有一个基本的C#套接字服务器

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

Socket clientSocket = listener.AcceptSocket();  
这将接受来自客户端的第一个连接

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

这样的壮举可能吗?还是我必须接受所有这些,并通过它们穿行

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

EDIT2:
经过一番搜索,我终于找到了一个类似的问题。在接受客户机的连接之前,您似乎无法区分客户机。问题是:


我想我至少可以知道连接尝试来自哪个IP地址,但在我连接到客户端之前,这似乎是不可能的。看来我终究要在客户中穿行了

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

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

您可以通过接受然后关闭连接来完成此操作,但是,如果您不能及时到达等待的连接,等待的连接最终将超时。@nhouser9客户端被编程为在超时后重试连接尝试,因此在我的情况下这不是问题。我将对问题进行编辑以澄清。然后,除了性能之外,没有其他真正的问题-如果服务器执行冗长的计算,您的客户端可能会等待相当长的一段时间。但是,否则,没有什么可以阻止您接受连接、关闭连接和接受新连接。@nhouser9您是说我可以接受一个客户端,检查它是否是我想要的,如果不是,请关闭连接?这并不是很理想,因为如果同一个客户尝试重新连接,我可能会经常与他联系。而且我的客户越多,这听起来会变得非常混乱。或者我误解了您的建议?您可以通过接受然后关闭连接来实现这一点,但是如果您不能及时到达等待的连接,等待的连接最终将超时。@nhouser9客户端被编程为在超时后重试连接尝试,所以这在我的情况下不是问题。我将对问题进行编辑以澄清。然后,除了性能之外,没有其他真正的问题-如果服务器执行冗长的计算,您的客户端可能会等待相当长的一段时间。但是,否则,没有什么可以阻止您接受连接、关闭连接和接受新连接。@nhouser9您是说我可以接受一个客户端,检查它是否是我想要的,如果不是,请关闭连接?这并不是很理想,因为如果同一个客户尝试重新连接,我可能会经常与他联系。而且我的客户越多,这听起来会变得非常混乱。还是我误解了你的建议?是的,但我无法控制与哪个客户互动。如果不是我想要的客户端,我可以接受连接并将其关闭,但这可能会导致同一台机器一遍又一遍地与我连接时出现严重问题。为了让您理解,这些客户机是我的机器,正在等待我与他们交换数据。我想一次给他们一个指示。机器知道我的IP,我不知道他们的IP,我不能保证他们的路由器让他们充当服务器(端口转发或DMZ)。这就是为什么我需要成为服务器,他们需要成为客户机。“不是你想要的客户机”是什么阻止你在客户机刚刚连接时为其提供服务?事实上,我不需要刚刚连接的客户机。如果我没有把我的问题说清楚,我非常抱歉。看-一个正常的方法是接受所有10个客户机(来自我的示例),然后一次给其中一个客户机写信。就像信使一样,但只在客户端和服务器之间。我在问是否可以避免维护这10个并发连接,只接受其中一个——我需要的客户端(机器)。是的,但这让我无法控制与哪个客户端交互。如果不是我想要的客户端,我可以接受连接并将其关闭,但这可能会导致同一台机器一遍又一遍地与我连接时出现严重问题。为了让您理解,这些客户机是我的机器,正在等待我与他们交换数据。我想一次给他们一个指示。机器知道我的IP,我不知道他们的IP,我不能保证他们的路由器让他们充当服务器(端口转发或DMZ)。这就是为什么我需要成为服务器,他们需要成为客户机。“不是你想要的客户机”是什么阻止你在客户机刚刚连接时为其提供服务?事实上,我不需要刚刚连接的客户机。如果我没有把我的问题说清楚,我非常抱歉。看-一个正常的方法是接受所有10个客户机(来自我的示例),然后一次给其中一个客户机写信。就像信使一样,但只在客户端和服务器之间。我想问的是,是否有可能避免维护这10个并发连接,而只接受其中一个——客户端(机器)