我正在使用以下代码
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;
}
}那有什么问题吗?为什么会发生这种情况,以及如何解决?
发布于 2014-03-11 09:04:32
您假设TCP以数据包的形式发送数据。这不是真的。TCP presents you a contiguous stream of bytes. --这意味着您收到的东西不一定与您发送的“块”相同。很可能,这让你的听筒很困惑。
处理此问题的最佳方法是不编写基于TCP的应用程序。使用一些较高级别的构造,如HTTP。客户端和服务器的库是可用的。他们帮你解决了很多问题。
发布于 2019-02-02 21:13:53
我试过了
for(int i =0; i < 100; i++){ 
Console.WriteLine("SendData > " + TcpSocket.Send(getModifiedData(MyData)));}
而且效果很好。http://prntscr.com/mfswpr
你能给我们看看你的客户端和服务器套接字吗?
发布于 2014-03-11 09:02:00
我最好的猜测是,您的接收代码会慢下来,而TCP缓冲区就会溢出。
如果您生成的数据比处理的速度更快,那么其中的一些最终会丢失。
https://stackoverflow.com/questions/22320656
复制相似问题