Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.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# 约1秒的TcpListener挂起()/AcceptTcpClient()延迟_C#_Performance_C# 3.0_Sockets_Tcplistener - Fatal编程技术网

C# 约1秒的TcpListener挂起()/AcceptTcpClient()延迟

C# 约1秒的TcpListener挂起()/AcceptTcpClient()延迟,c#,performance,c#-3.0,sockets,tcplistener,C#,Performance,C# 3.0,Sockets,Tcplistener,可能只需观看以下视频: 如您所见,连接启动(通过telnet或firefox)和我的程序第一次得到消息之间的延迟 下面是等待连接的代码 public IDLServer(System.Net.IPAddress addr,int port) { Listener = new TcpListener(addr, port); Listener.Server.NoDelay = true;//I added this just for testing

可能只需观看以下视频: 如您所见,连接启动(通过telnet或firefox)和我的程序第一次得到消息之间的延迟

下面是等待连接的代码

    public IDLServer(System.Net.IPAddress addr,int port)
    {
        Listener = new TcpListener(addr, port);

        Listener.Server.NoDelay = true;//I added this just for testing, it has no impact

        Listener.Start();

        ConnectionThread = new Thread(ConnectionListener);
        ConnectionThread.Start();


    }

    private void ConnectionListener()
    {
        while (Running)
        {
            while (Listener.Pending() == false) { System.Threading.Thread.Sleep(1); }//this is the part with the lag
            Console.WriteLine("Client available");//from this point on everything runs perfectly fast 
            TcpClient cl = Listener.AcceptTcpClient(); 

            Thread proct = new Thread(new ParameterizedThreadStart(InstanceHandler));
            proct.Start(cl);


        }

    }
(我在将代码放入代码块时遇到一些问题)


我尝试过几种不同的方法,可能是我使用了TcpClient/Listener而不是原始套接字对象吗?我知道,这不是强制的TCP开销,我试着在同一个线程中运行所有的东西,等等。

< P>你应该考虑异步地接受你的客户端,这很可能会消除你所看到的滞后。 我稍微修改了你的代码

public IDLServer(System.Net.IPAddress addr,int port)
{
    Listener = new TcpListener(addr, port);

    Listener.Start();        

    // Use the BeginXXXX Pattern to accept clients asynchronously
    listener.BeginAcceptTcpClient(this.OnAcceptConnection,  listener);
}

private void OnAcceptConnection(IAsyncResult asyn) 
{
    // Get the listener that handles the client request.
    TcpListener listener = (TcpListener) asyn.AsyncState;

    // Get the newly connected TcpClient
    TcpClient client = listener.EndAcceptTcpClient(asyn);

    // Start the client work
    Thread proct = new Thread(new ParameterizedThreadStart(InstanceHandler));
    proct.Start(client);

    // Issue another connect, only do this if you want to handle multiple clients
    listener.BeginAcceptTcpClient(this.OnAcceptConnection,  listener);    
}

也许是某种dns解析?您是使用IP地址访问服务器的主机还是使用DNS解析的某个名称?ParmesanCodice给出的代码应该毫不延迟地工作,除非客户端/网络端出现问题

尝试将以下行添加到windows\system32\drivers\etc\hosts:

127.0.0.1       localhost

它可能会解决您的问题,或者只作为127.0.0.1:85连接。调试器是否会增加开销

我在构建MMO服务器时遇到过类似的问题。 不记得我现在是怎么熬过来的

我认为这与服务上的资源分配有关,我使用Parmesancodie建议的方法(至少是类似的方法),在测试过程中,我发现前5到10个连接都是垃圾,但在那之后,该服务似乎会抛出新的连接,好像没有明天了

也许它是框架中的一个套接字

你试过负荷测试吗?
对它抛出1000个连接,看看会发生什么,在处理每个连接后,它应该会更快。

您可以避免整个侦听器。挂起while循环。AcceptTcpClient()是一个阻塞调用,因此您可以让代码运行并挂起它。我不知道为什么循环需要1秒(而不是1毫秒),但既然你指出了延迟的位置,你就可以消除它。

不,即使这样,延迟仍然会在调用OnAcceptConnection回调之前发生。这个例子无助于解决~1秒的延迟。@hoodos已经发布了正确的答案。我在连接中有一个一致的1秒延迟,即使是异步的。这个答案解决了我的问题,它似乎有点愚蠢,但连接到127.0.0.1而不是localhost为我修复了它。我猜问题出在某个防火墙/防病毒/安全报告中。你最终找到问题了吗?好奇你是如何解决这个问题的,有相同的问题吗