Tag: winsock

如何将IntPtr / Int转换为Socket?

我想将message.WParam转换为Socket。 protected override void WndProc(ref Message m) { if (m.Msg == Values.MESSAGE_ASYNC) { switch (m.LParam.ToInt32()) { case Values.FD_READ: WS2.Receive(m.WParam); case Values.FD_WRITE: break; default: break; } } else { base.WndProc(ref m); } } public class WS2 { public static void Receive(IntPtr sock) { Socket socket = sock; } } 如何将IntrPtr(sock)转换为Socket,以便我可以调用Receive()?

TCP延迟确认的解决方法是什么?

我发布了一个在线(基于网格)的video游戏,它使用TCP协议来确保服务器 – 客户端网络拓扑中的可靠通信。 我的游戏工作得相当好,但遭遇的延迟高于预期(类似的TCP游戏似乎在将延迟保持在最低限度方面做得更好)。 在调查时,我发现运行Microsoft Windows (而不是Mac OS X客户端)的客户端的延迟仅出乎意料地高。 此外,我发现如果Windows客户端在注册表中设置TcpAckFrequency=1并重新启动其计算机,则它们的延迟变得正常。 看来我的网络设计没有考虑延迟确认: 不考虑延迟确认 ,Nagle算法和Winsock缓冲的交互的设计可以极大地影响性能。 ( http://support.microsoft.com/kb/214397 ) 但是,我发现几乎不可能在我的游戏(或任何游戏)中考虑延迟确认。 根据MSDN,Microsoft TCP堆栈使用以下标准来决定何时在接收的数据包上发送一个ACK: 如果在延迟计时器到期(200ms)之前接收到第二数据包,则发送ACK。 如果在接收到第二数据包之前有数据要在与ACK相同的方向上发送并且延迟计时器到期,则ACK与数据段搭载并立即发送。 当延迟计时器到期(200ms)时,发送ACK。 ( http://support.microsoft.com/kb/214397 ) 阅读本文,可以假设Microsoft TCP堆栈上延迟确认的解决方法如下: 禁用Nagle算法(TCP_NODELAY)。 禁用套接字的发送缓冲区( SO_SNDBUF = 0),以便可以发送一个send调用来send数据包。 当调用send ,如果不希望立即send更多数据,则再次使用将被接收器丢弃的单字节数据调用send 。 利用这种方法,接收器将在与前一数据分组大致相同的时间接收第二数据分组。 因此, ACK应立即从接收方发送到发送方(模拟TcpAckFrequency=1在注册表中执行的操作)。 但是,从我的测试来看,这种延迟仅改善了注册表编辑的一半左右。 我错过了什么? 问:为什么不使用UDP? 答:我选择了TCP,因为我发送的每个数据包都需要到达(并按顺序); 如果丢失(或变得无序),则没有值得重传的数据包。 只有当数据包可以被丢弃/无序时,UDP才能比TCP更快!

什么是好的教程/ howto on .net / c#socket编程

我正在将使用Winsock控件的旧VB6代码移植到C#。 我没有做任何套接字编程,我想知道是否有人有一个很好的参考/教程/ howto,我可以用来开始加快速度。 当我继续使用我普遍没有效率的谷歌搜索时,我正在吸引蜂巢的头脑。 我目前正在使用UDP,而不是TCP。