【问题标题】:TcpListener request floodTcpListener 请求洪水
【发布时间】:2017-11-07 21:02:32
【问题描述】:

大家好:我正在努力确保我的 TcpListener 可以正确处理来自客户端的多个请求。我正在一个 for 循环中尝试多个 BeginSend 方法调用,并发现监听器的输出与我得到的响应数量不一致。即,如果我依次调用 BeginSend 20 次,我希望 Listener 给我 20 个响应。有时我得到 2 个,有时 3 个,有时更多,而且我发送给 Listener 的消息似乎是相互附加的,而不是被视为单独的实体。

假设我有一个有效的 TcpClient 类(见代码),它包装了一个基本的 TcpClient 和一个有效的 TcpListener 类(见代码),它通过引发一个 DataReceived 事件来响应来自连接的 TcpClient 的消息作为其参数。非常基本的代码

for(int i = 0; i < 10; i++)
{
    client.Client.BeginSend(Encoding.ASCII.GetBytes(i.ToString()), 0, i.ToString().Length, SocketFlags.None, null, null);
}

我希望 TcpListener 的输出是
0
1
...
9

相反,我得到的是:
0
123456789
或者,
0
1234
56
789
或者,
....
或 10 条单独消息的其他排列 以下是监听器的相关代码:

    private void ListenForNewClients()
    {
        Task.Run(async () =>
        {
            while (true)
            {
                var tcpClient = await tcpServer.AcceptTcpClientAsync();

                clients.Add(tcpClient.Client);
                tcpClient.Client.BeginReceive(buffer, 0, BufferSize, SocketFlags.None, ReceiveCallback, tcpClient.Client);

            }
        });
    }

还有 ReceiveCallback:

    private void ReceiveCallback(IAsyncResult ar)
    {
        var tcpClient = ar.AsyncState as Socket;
        try
        {
            var bytesRead = tcpClient.EndReceive(ar);

            if (bytesRead == 0)
            {
                tcpClient.EndReceive(ar);
            }

            var data = Encoding.ASCII.GetString(buffer, 0, bytesRead);

            DataReceived?.Invoke(this, data);

            buffer = new byte[BufferSize];
            tcpClient.BeginReceive(buffer, 0, BufferSize, SocketFlags.None, ReceiveCallback, tcpClient);

        }
        catch
        {
            clients.Remove(tcpClient);
        }
    }

【问题讨论】:

    标签: .net c#-4.0 tcp tcpclient tcplistener


    【解决方案1】:

    看来,我发送给侦听器的消息是相互附加的,而不是被视为单独的实体。

    这就是 TCP/IP 的工作原理。

    如果您同时编写客户端和服务器,那么我建议使用 SignalR,它可以保留消息边界。

    如果您必须使用 TCP/IP,那么您将需要某种形式的message framing

    【讨论】:

    • 感谢您的解释,斯蒂芬。这清楚地表明我需要更好地了解 Tcp 并帮助我让事情正常进行。
    猜你喜欢
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 2013-01-16
    • 2020-03-17
    相关资源
    最近更新 更多