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:你的第二条评论更糟糕,这表明你真的不知道你在说什么!