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

标签 c# .net vb.net sockets tcp

我正在使用以下代码

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/

相关文章:

c# - TFS:删除并重新创建文件,TFS 看不到添加

.NET 用实际值替换占位符文本的最有效方法?

vb.net - Visual Basic 列表框

vb.net - ASP.NET "The request was aborted: Could not create SSL/TLS secure channel"也与配置的 servicepointmanager 一起出现

c# - 启动时居中表格

json - 在 vb.net 中将 vb.net 类对象转换为 JSON 字符串

c# - 如何在 C# 中立即强制显示器进入省电模式?

c# - 查找 LDAP 用户的管理器

c# - Automapper 映射泛型类型

c# - 如何获取随机索引的 DropDownList 值?