我正在使用以下代码
for(int i =0; i < 100; i++){
TcpSocket.Send(getModifiedData(MyData));
}
代码被调用了太多次,可能每个 tick 调用一次。
套接字已连接到我的本地机器 (127.0.0.1),因此没有延迟、口袋丢失等问题。
最初的消息还不错,但后来我没有得到一些钱。
现在,如果我将该代码更改为 following,那么我所有的钱包都会被发送和接收!
for(int i =0; i < 100; i++){
Console.WriteLine("SendData > " + TcpSocket.Send(getModifiedData(MyData)));
}
是的,我很确定,因为我已经对此进行了 10 多次测试。使用 WriteLine
方法记录到控制台可修复此问题。
我完全迷失了这个非常奇怪的问题。
请注意,与问题中发布的第一个默认代码相比,以下代码有助于发送更多的钱包。
for(int i =0; i < 100; i++){
System.Threading.Thread.Sleep(1);
TcpSocket.Send(getModifiedData(MyData));
}
但即使 sleep ,我的口袋也有大约 10% 丢失了!
我发现记录到控制台的最佳解决方案可以无损发送 100% 的数据包。
接收者代码:
// variables
static NetworkStream^ NS;
// CClient::NS = gcnew NetworkStream(CClient::sender);
//
Dictionary<String^, Object^>^ x = (Dictionary<String^, Object^>^)PClientFuncs::Deserialize(CClient::NS);
//method
Object^ PClientFuncs::Deserialize(Stream^ s){
try{
BinaryFormatter^ formatter = gcnew BinaryFormatter();
DeflateStream^ serializationstream = gcnew DeflateStream(s, CompressionMode::Decompress);
return formatter->Deserialize(serializationstream);
}
catch (Exception^) {
return nullptr;
}
}
那么问题是什么?为什么会发生这种情况以及如何解决?
最佳答案
您假设 TCP 以数据包的形式发送数据。这不是真的。 TCP presents you a contiguous stream of bytes.这意味着您收到的内容不一定与您发送的相同“ block ”中收到。这可能会使您的接收器感到困惑。
处理这个问题的最好方法是不要编写基于 TCP 的应用程序。使用一些更高级别的构造,如 HTTP。客户端和服务器的库可用。他们为您解决了很多问题。
关于c# - 如果我在毫秒内调用太多,为什么 Socket over Tcp 不发送?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22320656/