如果我在一毫秒内调用它太多,为什么Socket over Tcp不会发送?

时间:2014-03-11 08:53:27

标签: c# .net vb.net sockets tcp

我正在使用以下代码

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;
}
}

那么问题是什么?为什么会发生这种情况以及如何解决?

3 个答案:

答案 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缓冲区只会溢出。

如果您生成的数据速度超过了处理速度,那么其中一些数据最终会丢失。