首页 > 解决方案 > C# TCP Socket 在慢速蜂窝网络连接上接收部分数据,而连接仍未断开

问题描述

我在 Windows 10 Pro 上使用控制台应用程序作为服务器。使用 Unity Engine 作为客户端制作的 Android 应用程序。对于这两个应用程序,我在 .Net 框架上使用 TCP 套接字。

注意:服务器始终在有线连接上运行。

有线和 Wi-Fi 连接上的一切都运行良好,无论数据包长度如何,都没有问题。

问题

每天晚上,蜂窝网络变得太糟糕了,当数据稍微大一点,大约 50 kb 时,客户端应用程序只接收到部分数据

服务器端的代码:

_socket.Send(Encoding.ASCII.GetBytes(s));

_socket:是一个实例 System.Net.Sockets.Socket。

s:是字符串。

客户端的代码:

public static void ReceiveData()
{ 
    message = string.Empty;
    _socket.BeginReceive(globalBuffer, 0, globalBuffer.Length, SocketFlags.None, ReceiveCallBack, null);
}
public static void ReceiveCallBack(IAsyncResult ar)
{
    int internalBuffer = _socket.EndReceive(ar);
    byte[] subtractedBuffer = new byte[internalBuffer];
    Array.Copy(globalBuffer, subtractedBuffer, internalBuffer);
    string stmp = Encoding.ASCII.GetString(subtractedBuffer);
    message += stmp;

    while (message.Contains("</Cargo>"))
    {
       string stringOne = message.Substring(0, message.IndexOf("</Cargo>") + "</Cargo>".Length);
       string stringLeft = message.Substring(message.IndexOf("</Cargo>") + "</Cargo>".Length);
       message = stringLeft;

       Thread thread = new Thread(TreatOrder);
       thread.Start(stringOne);
    }

    if (!(_socket.Poll(1000, SelectMode.SelectRead) && _socket.Available == 0))
    {
        NetWorkScript.LastConnectedTime = DateTime.Now;
        _socket.BeginReceive(globalBuffer, 0, globalBuffer.Length, SocketFlags.None, ReceiveCallBack, null);
    }
    else
    {
      Debug.log("Connection lost");
    }   
}

我注意到的:

下一行代码从未执行

else
{
   Debug.log("Connection lost");
}  

服务器继续通过另一个线程在同一个 Socket 实例上接收来自客户端的消息,这就是如何知道连接没有断开,除非 TCP 连接只能以一种方式断开。

到目前为止我所了解的

TCP 将确保数据包以准确的顺序到达。

我的服务器应用程序中的下一行代码结束了它的职责,操作系统将执行发送数据的任务。

_socket.Send(Encoding.ASCII.GetBytes(s));

我对什么感到困惑

操作系统如何将数据传递给客户端?,如果连接仍然存在,为什么不继续尝试直到发送所有数据?

如果客户端不确认接收数据包,我应该创建自己的协议并发送小数据包然后重新传输吗?

标签: c#sockets

解决方案


推荐阅读