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# Socket.ReceiveAsync磁头能否连接到C10K?_C#_Sockets_C10k - Fatal编程技术网

C# Socket.ReceiveAsync磁头能否连接到C10K?

C# Socket.ReceiveAsync磁头能否连接到C10K?,c#,sockets,c10k,C#,Sockets,C10k,一个使用TCP套接字或者甚至遇到过这个问题吗?我认为这完全不是另一个问题的重复,正如有人提出的: 这个问题更多的是讨论各种线程模型,它们并不总是适用于Socket.***Async,它们都使用SocketAsyncEventArgs 这个问题的答案在很大程度上取决于您的运行时和操作系统。我最近在为Unity开发解决方案的过程中走上了这条路,所以我将分享我所知道的,尽管这个问题有点老了 让我们首先谈谈Windows和MS.NET,从3.5开始,直到现在,这些方法都已经实现了。在这个运行时和平台上组

一个使用TCP套接字或者甚至遇到过这个问题吗?

我认为这完全不是另一个问题的重复,正如有人提出的: 这个问题更多的是讨论各种线程模型,它们并不总是适用于Socket.***Async,它们都使用SocketAsyncEventArgs

这个问题的答案在很大程度上取决于您的运行时和操作系统。我最近在为Unity开发解决方案的过程中走上了这条路,所以我将分享我所知道的,尽管这个问题有点老了

让我们首先谈谈Windows和MS.NET,从3.5开始,直到现在,这些方法都已经实现了。在这个运行时和平台上组合这些套接字方法时,您肯定可以打破c10k。采用SocketAsyncEventArgs参数的****异步方法直接在运行时进行本机调用,本机调用映射到Windows中的IO完成端口。这是贯穿运行时的一条特殊路径,它不仅仅阻止分配IAsyncResult对象。我认为在Linux上使用.NET标准也很快,但我不能直接说

接下来,让我们谈谈Linux上的Mono。具体而言,我目前正在建设: Mono C编译器版本4.6.2.0 这也将中断c10k,但其工作方式不同。从我看到的情况来看,****异步方法在运行时采用与所有其他异步方法相同的路径,除了****异步调用采用最短路径并避免IAsyncResult分配。运行时通过IOSelector.Add将您的请求作为IOSelector作业提交。出于这个原因,****异步方法在Mono中似乎都不会返回false,尽管我不认为这种行为总是正确的。我认为在Windows上使用Mono同样快,但我不能这么说

最后,让我们谈谈团结。我使用的是2018.3.2f1,它的Mono 5.11.0运行时设置为.NET 4.x compat。我不确定是否有可能在统一中打破c10k。我不知道为什么,但我知道在Mono和.NET中轻松突破c10k的相同实现甚至不会接近。我想这是因为他们的线程池设置不同。。。也许是为了适应他们的工作制度,但这只是一个猜测。非常奇怪的事情发生了,比如同步接受优于异步。接受从未收到回调的同步请求,依此类推

在Unity之外打破c10k的一些技巧: -在IO完成回调中尽可能少地执行操作。不要像MSDN示例那样将对其他异步方法的调用放在它们内部 -如果您可以管理它,就不要因为您的设计而调用SendAsync和ReceiveAsync互相阻塞。不能有两个具有相同arg的未完成调用,但可以有多个和单独的arg,因此可以使用send/recv缓冲区。但是请注意,订购可能会变得复杂,例如,在同一套接字上有多个未完成的RECV,以及并发队列从回调中调度返回的参数的情况下 -如果您必须在线程之间共享资源,则System.Collections.Concurrent是您的朋友。不要滚动你自己的容器,因为这些容器不是你不打破c10k的原因,你将永远无法匹配这些婴儿所经历的测试量


祝你好运,玩得开心:如果你在团结中找到了成功的秘诀,别忘了告诉我。如果我这样做了,我一定会更新此内容。

感谢您的回答和分享您的经验。自从删除并使用.NET的本机SocketAsyncEventArgs后,我得出结论,SAEA是一条出路。我忘了提到我已经编写了一个TCP网络库,