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

时间:2016-02-24 07:51:49

标签: c# sockets tcp

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

在您提供的链接代码中,例如:

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