我只收到第一个数据包,为什么

本文关键字:数据包 为什么 第一个 | 更新日期: 2023-09-27 18:35:54

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

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

我已经打开了与telnet/PuTTY的连接,但我只从PuTTY收到第一个输入的字符/初始化信息,仅此而已。服务器不会停止,因为我可以打开新连接并接收每条消息。

尝试了以下代码(异步部分有点问题,它实际上阻止了程序的其余部分,这就是我使用 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);
    }

我只收到第一个数据包,为什么

在回调 (Server_OnReceived1) 中,如果您正在等待更多数据,则应再次调用 BeginReceive。如果您不这样做,则不会调用您的回调(因为您尚未通知您已准备好接收更多数据),尽管有数据。

在您提供的链接的代码中,如下所示:

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