【问题标题】:How to get return value of 0 in UDP recvfrom() call after shutdown call.?关机调用后如何在 UDP recvfrom() 调用中获得 0 的返回值。?
【发布时间】:2012-11-28 14:45:05
【问题描述】:

当发送方按照指定的here 正常关闭套接字连接时,我尝试通过网络获取值 0。当我使用无阻塞呼叫时,在数据从发送方发送到接收方之前,我在 UDP 流中得到了 -1。发送原始数据后,当我关闭连接(尝试关闭套接字并关闭发送方的套接字)时,我仍然得到 -1 而不是 0 表示套接字已关闭。任何人都可以请帮助是否有任何方法可以得到相同的。

谢谢。

【问题讨论】:

  • UDP 套接字没有connection 的概念
  • @aleguna 是的,这很好,但是文档中提到的从 recvfrom() 获取返回值 0 的机制是什么。
  • 没有这样的机制。而且您不能关闭 UDP 套接字。这是一个仅限 TCP 的操作。您是否忽略了来自 shutdown() 的 -1/errno 结果?
  • 如果你想要一个返回值 0 发送一个 0 字节长度的消息。
  • 但是这只是表示消息长度为零,而不是对等断开。

标签: c++ networking udp


【解决方案1】:

当 UDP 套接字是 close(2)-ed 时,即使套接字是 connect(2)-ed,也不会发送任何内容。另一方面,TCP 发起four-way connection tear-down。看起来你混淆了这两种情况。

【讨论】:

    【解决方案2】:

    用于关机的 UNIX 手册页 states 如下:

    返回值:

    成功时返回零。出错时,返回 -1, 并且 errno 设置得当。

    错误:

    EBADF - sockfd 不是有效的描述符。
    ENOTCONN - 指定的套接字未连接。
    ENOTSOCK - sockfd 是一个文件,而不是一个套接字。

    和Windows平台have完全一样:

    返回值

    如果没有发生错误,关机返回零。否则,值为 返回 SOCKET_ERROR,可以检索到具体的错误码 通过调用 WSAGetLastError。

    事情是:UDP 不是面向连接的协议,并且 connect() 调用它并不意味着建立任何关联。

    所以我猜,你实际上得到了 ENOTCONN 错误(或 WSAENOTCONN,如果你在 Windows 上) 检查您的 errno(或 Windows 上的 WSAGetLastError())

    【讨论】:

    • 你已经谈到了 shutdown() 返回码,但我想要的是关于套接字的关闭或关闭,我应该得到 0 作为 recvfrom() 调用的返回码,因为套接字描述符是 no发件人那边的时间更长。
    • @javabinder 他在谈论它而你一直忽略它。如果您按照应有的方式检查 shutdown() 的返回码,您会发现它没有成功。
    • @EJP 会检查相同的.. :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多