我只收到第一个数据包,为什么
本文关键字:数据包 为什么 第一个 | 更新日期: 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);