c# - 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++ - 尝试从 C++ 访问 UWP 的 EmailMessage 类会导致“REGDB_E_CLASSNOTREG 类未注册”错误
- python - Pandas - 列中引号(“)符号后的单词可以大写吗?
- asp.net - 如何在剃须刀页面中自动增加属性
- c++ - 读取某些文件时出现分段错误,似乎与文件大小无关
- android - Xamarin 按钮从屏幕上掉下来
- amazon-s3 - 如何在写入 Redshift DW 之前从 S3 存储桶转换数据?
- wordpress - WordPress 循环限制
- sql-server - 使用 select 语句将多行插入到 SQL 表中?
- csv - Python csv数据记录在while循环中不起作用
- javascript - AJAX 上传动态创建的 HTML 文件