【问题标题】:I'm only receiving the first packet, why?我只收到第一个数据包,为什么?
【发布时间】:2016-02-24 07:51:49
【问题描述】:

我搜索了一个有效的 TCP 库,找到了这个:https://codereview.stackexchange.com/questions/24758/tcp-async-socket-server-client-communication

我从@Jesse C. Slicer 的回答中实现了六个重构类,对其进行了修改以允许任意端口号(在StartListening() 方法中添加了int Port 参数)。

我已经打开了与 telnet/PuTTY 的连接,但我只收到来自 PuTTY 的第一个键入的字符/init 信息,而没有更多信息。服务器不会停止,因为我可以打开新连接并接收每一条消息。

我尝试了以下代码(异步部分有点问题,它实际上阻塞了程序的其余部分,这就是我使用BackgroundWorker的原因):

private BackgroundWorker serverThread;
    private IAsyncSocketListener server;
    public Connection()
    {
        server = AsyncSocketListener.Instance;
        serverThread = new BackgroundWorker();
        serverThread.DoWork += ServerThread_DoWork;
        serverThread.RunWorkerAsync();
    }
    private void Server_OnReceived1(int id, string msg)
    {
        System.Diagnostics.Debug.WriteLine($"String: {msg}");
        System.Diagnostics.Debug.WriteLine($"Bytes: {string.Join(", ",msg.Select(x=>(int)x))}");
    }

    private void ServerThread_DoWork(object sender, DoWorkEventArgs e)
    {
        server.MessageReceived += Server_OnReceived1;
        server.StartListening(1093);
    }

【问题讨论】:

    标签: c# sockets tcp


    【解决方案1】:

    在您的回调 (Server_OnReceived1) 中,如果您正在等待更多数据,您应该再次调用 BeginReceive。如果你不这样做,你的回调将不会被调用(因为你还没有通知你准备好接收更多数据),尽管它有数据。

    在您提供的链接代码中,类似于:

    state.listener.BeginReceive(state.buffer, 0, StateObject.BufferSize, SocketFlags.None, new AsyncCallback(ReceiveCallback), state);
    

    【讨论】:

    • 我无法真正掌握这一点,我是否应该将这一行放在这三行之下,在 AsyncSocketListener 类中? if (messageReceived != null) { messageReceived(state.Id, state.Text); 如果我使用它,在客户端断开连接后,CPU 使用率会达到最大值。我现在似乎解决了一半问题,因为我收到了不止一条消息。
    • 如果接收到的长度为0,则必须检查回调。在这种情况下,您不应再次调用BeginReceive,因为套接字已被通信的另一端关闭。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 2017-05-10
    • 2013-12-14
    • 2022-07-29
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多