【发布时间】:2015-06-13 18:11:15
【问题描述】:
我目前正在计划如何为 TCP 服务器开发一个中间人网络应用程序,该应用程序将在服务器和客户端之间传输数据。它将充当服务器的常规客户端和远程客户端的服务器,而无需修改任何数据。它将可选地用于检测和测量服务器或客户端在连接处于非活动状态时无法接收准备接收的数据的时间。
我打算使用阻塞发送和接收功能。在进行任何数据传输之前,我会调用 setsockopt 函数将 SO_SNDTIMEO 和 SO_RCVTIMEO 设置为大约 10 - 20 毫秒,假设它将强制阻塞发送和接收函数提前返回,以便路由另一个活动连接数据。每个连接运行线程看起来太昂贵了。我不会在这里使用异步套接字,因为我无法保证它们会在几秒钟内完成,尤其是在发送或接收大量数据时。高数据延迟看起来不太好。我会在这里使用非常小的缓冲区,但是为每个接收到的字节调用函数看起来有点过头了。
我的下一个假设是,如果之前已因超时终止并且接收的数据少于请求的数据,那么稍后调用 send 或 recv 是安全的。
但我对 msdn 提供的相互矛盾的信息感到困惑。
发送函数
https://msdn.microsoft.com/en-us/library/windows/desktop/ms740149%28v=vs.85%29.aspx
如果没有发生错误,send 返回发送的总字节数,即 可以小于 len 参数中请求发送的数量。
SOL_SOCKET 套接字选项
https://msdn.microsoft.com/en-us/library/windows/desktop/ms740532%28v=vs.85%29.aspx
SO_SNDTIMEO - 阻塞发送调用的超时时间,以毫秒为单位。 此选项的默认值为零,表示发送 操作不会超时。如果阻塞发送调用超时,则 连接处于不确定状态,应关闭。
我的假设是否正确,我可以像这样使用这些功能?也许有更有效的方法来做到这一点?
感谢解答
【问题讨论】:
-
SO_SNDTIMEO 的文档用非常清楚的语言与您的假设相矛盾。尊重文档。
标签: c++ c sockets network-programming