gpt4 book ai didi

c# - 如果我在毫秒内调用太多,为什么 Socket over Tcp 不发送?

转载 作者:可可西里 更新时间:2023-11-01 02:55:15 26 4
gpt4 key购买 nike

我正在使用以下代码

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com