【问题标题】:Winsock recv not working after shutdownWinsock recv 关机后不工作
【发布时间】:2012-04-08 10:10:49
【问题描述】:

我正在尝试让一个简单的 winsock 程序运行,所以 我创建我的套接字并发送我的数据就好了。然后我使用shutdown(ConnectSocket, SD_SEND),根据msdn,禁用发送数据,但不接收? msdn 上的示例也是这样做的。

但是在我调用 shutdown 之后,我的 recv 函数返回 0 而没有收到任何数据。
如果我注释掉关闭代码,一切都会正常运行。

我错过了什么吗?

【问题讨论】:

  • 你对对方有控制权吗?你知道它是否会在读取 0 字节后立即关闭连接(一旦你切断了它的传入数据......它会立即关闭连接)?

标签: c++ windows sockets winsock


【解决方案1】:

不,这很正常。对方通过关机来回应你的关机。从recv 返回零表示正常连接关闭。如果您不希望对方关闭其一半的连接,请不要关闭您的。

(当对recv 的调用返回零时,您希望对方做什么?)

【讨论】:

  • 我的印象是,如果您指定SD_SEND,它只会关闭发送,而不是接收。你必须使用SD_RECEIVE 来关闭接收。
  • 没错。您关闭了发送端,而另一端则通过关闭其发送端来响应。这个连接的另一端是什么?它应该做什么? (你和对方有什么协议可以继续使用半开连接吗?)
  • 这取决于在给定协议中如何解释关闭。例如,在 HTTP 中,发送请求后的客户端发送关闭(尽管不寻常)不能被解释为“不管你要发送什么,我不需要响应”。也就是说,如果您正在运行一个简单的回显服务器,那么服务器很可能也会通过关闭来响应。
【解决方案2】:

如果是 HTTP 协议,使用 Connection 标头关闭连接或保持打开:

连接:关闭

在这种情况下,您不需要关闭发送

连接:保持活动状态

接收将循环而不关闭连接的发送部分

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    相关资源
    最近更新 更多