Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.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,假设以下代码: Task.Run(()=>{ while(true){ Socket connection = socket.Accept(); // Problem Task.Run(()=> { //Receive from and Send to connection } ) } }) 尽管它能够以多线程方式为连接提供服务,但所有请求都是一个接一个地提供服务,而不是以完全并发的方式提供服务,因为socket.Accept

假设以下代码:

Task.Run(()=>{
     while(true){
         Socket connection = socket.Accept(); // Problem
         Task.Run(()=> { //Receive from and Send to connection } )
     }
})
尽管它能够以多线程方式为连接提供服务,但所有请求都是一个接一个地提供服务,而不是以完全并发的方式提供服务,因为
socket.Accept()
处于while循环中。另一方面,它不能移动到内部任务中,因为在这种情况下,将创建无限(非常大且未知)数量的
accept()

这个问题的正确解决方案是什么

例如:

 Connection A -- Accepted at 3:30:00:00 PM
 Connection B -- Accepted at 3:30:00:00 PM
 Instead of 
 Connection A -- Accepted at 3:30:00:00 PM
 Connection B -- Accepted at 3:30:00:50 PM

我想这里可能会发生一些事情。不幸的是,我们无法了解您是如何使用
accept
方法返回的
socket
对象的——其中可能存在一些可能导致延迟的陷阱——但一般来说,不可能严格并行地接受连接

据报道,

Accept同步提取第一个挂起的连接请求 从侦听套接字的连接请求队列,然后 创建并返回一个新套接字


因此,.NET保留(访问)来自底层操作系统的挂起请求队列(需要注意的是,此队列长度受操作系统限制)。根据TCP/IP的工作方式,在单个套接字上一次只能为一个客户端提供服务。因此,发生的情况是,一个客户端连接,您调用
accept
,并在另一个(通常是高数值)端口上为该客户端创建一个新的TCP套接字,该套接字由accept方法返回。这必须以连续的方式发生。最初连接多个客户端的唯一方法是使用多个侦听端口。

您应该有多个套接字来调用accept。@VuVirt:multiple sockets??那么有多少人???不,那不是解决办法。一个愚蠢的人可以伪造这样的东西。你应该为每一个新连接创建一个新的套接字,并保留原来的套接字以监听新的连接connections@mousetail:对不起,你不知道你在说什么。@mousetail:你的第二条评论更糟糕,这表明你真的不知道你在说什么!