2012-10-20 38 views
3

我正在编辑旧的MFC应用程序,并且必须添加一些基本的网络功能。操作方必须接受一个简单的指令(数字1,2,3,4 ...)并根据这些指令进行操作。客户希望延迟尽可能快,所以自然我决定使用数据报(UDP)。在MFC应用程序中侦听UDP或切换到TCP

但是阅读各种资源给我留下了窃听。我无法在MFC中侦听UDP套接字(CAsyncSocket),只能调用接收哪些块并等待。阻止用户界面并不是很聪明。所以我想我可以使用一些线程技术,但由于我没有经历过MFC的所有经历,应该如何实现?

问题的另一部分是我应该这样做,还是回到TCP,考虑可靠性和实施问题。我知道UDP是不可靠的,但它真的有多么不可靠?我读到速度提高了50%,这对我来说很重要。

参考文献I中: http://msdn.microsoft.com/en-us/library/09dd1ycd(v=vs.80).aspx

+0

延迟什么?发送命令或接收命令的响应? – Serge

+0

发送一个命令。远程应用程序应该在发出命令后尽快开始工作。 –

+0

命令的顺序是否相关? – Serge

回答

1

大多数在TCP“延迟”的是建立初始连接所要求的握手。

如果您的客户端应用程序要从您的MFC应用程序请求很多命令,那么TCP是毫不费力的。客户端打开TCP连接并保持打开状态。

如果您的MFC应用程序将接收来自不同客户端的大量临时命令,那么UDP可能是适当的,但您必须权衡是否节省TCP握手的微小成本值得的可能性是命令可能永远不会发生,因为UDP把它扔掉了。

+0

这些命令将来自一个地方。但是,“服务器”会在同一时间将它们发送给更多的客户端。成本有多少? –

+1

如果你确实使用TCP,不要忘记关闭Nagle的算法(通过setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,...),否则每次send()调用将得到〜200mS的延迟。 –

+0

@JeremyFriesner - 禁用当服务器不为每个发送()生成一个回复时,Nagle非常重要。在服务器正在回复每个传入消息的情况下,它不会有任何区别。 – Roddy

0

你为什么不能听使用CAsyncSocket在MFC UDP套接字?我有这样的代码。请以端口号SOCK_DGRAM和FD_READ作为参数调用Create()。应该自动调用OnReceive()。如果没有,可以通过使用FD_READ参数调用AsyncSelect()来刺激它。