【问题标题】:Multi Tcp server can only handle one connectionMulti Tcp server 只能处理一个连接
【发布时间】:2018-07-02 09:22:50
【问题描述】:

我正在开发一个可以处理许多客户端的 tcp 服务器。它是用 c# 异步和回调编写的。 所以我完成了,但服务器只能处理一个连接...... Somewehre 包含一个错误,但经过 3 天的搜索,我不知道在哪里。我将粘贴代码。搞笑:客户端不会抛出任何错误。服务器只显示一个连接的客户端。其他客户端无法连接。

public class StateObject
{
    public Socket WorkSocket;
    public const int BufferSize = 32;
    public byte[] Buffer = new byte[BufferSize];
    public StringBuilder Sb = new StringBuilder();
}

internal class TcpServer
{
    public static Socket ServerSocket;
    public static List<SimClient> LbConnections = new List<SimClient>();

    public static async void StartTcpServerAsync()
    {
        try
        {
            await Task.Run(() =>
            {
                ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                LbConnections = new List<SimClient>();
                var serverIp = new IPEndPoint(IPAddress.Parse(Settings.Default.IPAddress), Settings.Default.Port);

                ServerSocket.Bind(serverIp);
                ServerSocket.Listen(0);
                InitServer.IsServerReady = true;

                ServerSocket.BeginAccept(AcceptCallback, ServerSocket);
            });
        }
        catch (Exception e)
        {
            AdvancedLogging.WriteLog(e.Message + "(" + e.InnerException + ")", 2);
            InitServer.IsServerReady = false;
        }
    }

    private static void AcceptCallback(IAsyncResult result)
    {
        var listener = (Socket)result.AsyncState;
        var handler = listener.EndAccept(result);

        var state = new StateObject();
        state.WorkSocket = handler;

        LbConnections.Add(new SimClient { State = state });
        handler.BeginReceive(state.Buffer, 0, StateObject.BufferSize, SocketFlags.None, ReceiveCallback, state);
    }

    private static void ReceiveCallback(IAsyncResult result)
    {
        var state = (StateObject)result.AsyncState;
        var socket = state.WorkSocket;
        var received = socket.EndReceive(result);

        if (received <= 0)
        {
            socket.BeginReceive(state.Buffer, 0, StateObject.BufferSize, SocketFlags.None, ReceiveCallback, state);
            return;
        }

        state.Sb.Append(Encoding.ASCII.GetString(
            state.Buffer, 0, received));

        var content = state.Sb.ToString();
        if (content.IndexOf("<EOF>", StringComparison.Ordinal) > -1)
        {
            DataHandler.HandleData(content.Substring(0, content.Length - 5), state);
            state.Sb.Clear();
            socket.BeginReceive(state.Buffer, 0, StateObject.BufferSize, SocketFlags.None, ReceiveCallback, state);
        }
        else
        {
            socket.BeginReceive(state.Buffer, 0, StateObject.BufferSize, SocketFlags.None, ReceiveCallback, state);
        }
    }
}

【问题讨论】:

    标签: c# sockets tcp server connection


    【解决方案1】:

    拨打handler.BeginReceive后需要拨打BeginAccept

    private static void AcceptCallback(IAsyncResult result)
    {
        var listener = (Socket)result.AsyncState;
        var handler = listener.EndAccept(result);
    
        var state = new StateObject();
        state.WorkSocket = handler;
    
        LbConnections.Add(new SimClient { State = state });
        handler.BeginReceive(state.Buffer, 0, StateObject.BufferSize, SocketFlags.None, ReceiveCallback, state);
        ServerSocket.BeginAccept(AcceptCallback, ServerSocket);  // <<---
    }
    

    它的工作原理与BeginReceiveEndReceive 相同。


    在这种情况下,await Task.Run(() =&gt; 是无用的。你混合了两种不同的方法。 TPL 和异步回调。

    【讨论】:

      【解决方案2】:

      如果我移动 ServerSocket.BeginAccept(AcceptCallback, ServerSocket);在 AcceptCallback 中,AcceptCallback 不会被任何时候调用。

      编辑 我发现了错误。我需要调用 ServerSocket.BeginAccept(AcceptCallback, listener); 谢谢:)

      【讨论】:

        猜你喜欢
        • 2012-09-18
        • 2021-01-21
        • 1970-01-01
        • 1970-01-01
        • 2020-05-11
        • 2023-03-16
        • 2018-01-31
        • 2015-06-01
        • 1970-01-01
        相关资源
        最近更新 更多