.NET中的TCP套接字分片

早上

我试图在不使用第三方库的情况下用C#编写高性能的HTTP服务器,在阅读期间,我在nginx博客上找到了这篇文章上面提到的正在使用SO_REUESEPORT,但是该选项在.NET套接字和Windows中均不可用,因此我搜索了该选项的替代方法,并且我已经阅读到Windows和.NET均可用的SO_REUSEADDR是我选择的选项有寻找。

我试图通过创建4个套接字并在绑定套接字并开始侦听之前启用重用地址来实现这一点,但是之后发生的事情是只有一个套接字接受连接,即使其线程繁忙。

static readonly byte[] Response = Encoding.ASCII.GetBytes("HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r");

static int s_ListenerIndex = 0;

static void Main(string[] args)
{
    var listenAddress = new IPEndPoint(IPAddress.Any, 26000);

    var sockets = new Socket[4];

    Console.WriteLine("Creating sockets");

    for (int i = 0; i < sockets.Length; i++)
    {
        sockets[i] = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        sockets[i].SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
        sockets[i].Bind(listenAddress);
    }

    Console.WriteLine("Starting listener threads");

    for (int i = 0; i < sockets.Length; i++)
    {
        var socket = sockets[i];
        CreateThread(() => ListenSocket(socket));
    }

    Thread.Sleep(Timeout.Infinite);
}

static void ListenSocket(Socket socket)
{
    var listenerId = Interlocked.Increment(ref s_ListenerIndex);
    socket.Listen(100);
    Console.WriteLine($"Socket #{listenerId} is listening");

    while (true)
    {
        Socket client = socket.Accept();
        Console.WriteLine($"Socket #{listenerId} accepted connection");
        client.Send(Response);
        client.Close();
    }
}

static void CreateThread(ThreadStart threadStart)
{
    var thread = new Thread(threadStart);
    thread.IsBackground = true;
    thread.Start();
}

我是在做错什么,还是Windows和.NET无法完成整个技巧?

罗恩·史密斯

在Windows上,SO_REUSEADDR选项没有用于HTTP服务器的用例。唯一真正的用例是将数据传递到绑定在同一端口上的所有套接字的多播套接字。

我建议这篇SO帖子进行深入讨论。SO_REUSEADDR和SO_REUSEPORT有何区别?

在带有IOCP的Windows下,您不需要等效的Linux / Unix,它可以在多个线程之间提供负载平衡。IOCP会为您解决这个问题。实现方式有很大不同,但是实现了相同的高度可扩展的结果。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

优化VB.NET中的TCP / IP套接字实现

来自分类Dev

Swift中的TCP套接字

来自分类Dev

模拟Windows中TCP套接字的慢速

来自分类Dev

从线程中的Java TCP套接字读取

来自分类Dev

iOS:在套接字中读写(TCP连接)

来自分类Dev

使用 VB.NET 中的套接字通过 TCP 发送字节数组

来自分类Dev

TCP套接字-InvalidOperationException

来自分类Dev

Rails TCP套接字

来自分类Dev

套接字TCP连接

来自分类Dev

linux中的分段错误(C中的套接字编程(TCP))

来自分类Dev

linux中的分段错误(C中的套接字编程(TCP))

来自分类Dev

C中TCP / IP套接字中的代码段说明

来自分类Dev

Python 2.7.8:套接字-TCP套接字中的客户端服务器数据丢失

来自分类Dev

C ++中基于TCP套接字的可变长度消息

来自分类Dev

在python中关闭TCP套接字的正确方法

来自分类Dev

在Java中维护TCP套接字的成本有多高

来自分类Dev

原始套接字中的TCP数据包-Centos 6.6

来自分类Dev

通过C中的TCP套接字发送结构

来自分类Dev

TCP套接字连接中同步与异步的优势

来自分类Dev

通过Python中的TCP套接字发送文件

来自分类Dev

仅在成功传输后关闭Greenlet中的TCP套接字

来自分类Dev

不同服务器中的套接字TCP连接

来自分类Dev

在Windows中模拟TCP套接字的速度较慢

来自分类Dev

TCP客户端套接字无法在onActivityResult()中运行

来自分类Dev

与TCP套接字和PIC的Java通信卡在read()中

来自分类Dev

列出/ dev / tcp / localhost /中的所有打开的套接字

来自分类Dev

TCP客户端在android服务中读写套接字

来自分类Dev

如何在套接字连接中接收 tcp 标志

来自分类Dev

同步对TCP套接字的读写