我正在使用以下代码
for(int i =0; i < 100; i++){
TcpSocket.Send(getModifiedData(MyData));
}
代码被调用太多,可能每次打勾一次。
套接字已连接到我的本地计算机(127.0.0.1),因此没有延迟,丢失丢失等 第一条消息很好但我以后没有得到一些口袋。
现在,如果我将该代码更改为以下内容,那么我的所有口袋都会被发送并收到!
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));
}
但是,即使睡了大约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;
}
}
那么问题是什么?为什么会发生这种情况以及如何解决?
答案 0 :(得分:1)
您假设TCP以数据包的形式发送数据。这不是真的。 TCP presents you a contiguous stream of bytes.这意味着您收到的内容不一定与发送时的“块”相同。可能会让你的接收者感到困惑。
解决此问题的最佳方法是不编写基于TCP的应用程序。使用一些更高级的构造,如HTTP。可以使用客户端和服务器的库。他们为你解决了很多问题。
答案 1 :(得分:0)
我尝试过
for(int i =0; i < 100; i++){
Console.WriteLine("SendData > " + TcpSocket.Send(getModifiedData(MyData)));
}
,并且工作正常。 http://prntscr.com/mfswpr
您能告诉我们您的客户端和服务器套接字吗?
答案 2 :(得分:-2)
我最好的猜测是你的接收代码会变慢,而TCP缓冲区只会溢出。
如果您生成的数据速度超过了处理速度,那么其中一些数据最终会丢失。