【问题标题】:socket send and EWOULDBLOCK套接字发送和 EWOULDBLOCK
【发布时间】:2018-07-21 11:27:19
【问题描述】:

在套接字通信中:

  1. 在阻塞模式下,send() 会返回发送的字节数,然后我必须重复send(),直到所有数据都发送完或套接字错误。

  2. 在非阻塞模式下,send() 如果不能立即发送所有数据,将返回 EAGAIN/EWOULDBLOCK 错误,然后,我将 select() 在 writefds 参数上,直到我收到信号。

我的问题:

  1. 来自select() 的信号是否适用于所有数据? (不是部分)。
  2. 来自select() 的错误是否为套接字故障?

【问题讨论】:

    标签: c sockets send


    【解决方案1】:

    在非阻塞模式下,send() 如果不能立即发送所有数据,将返回 EAGAIN/EWOULDBLOCK 错误

    如果它不能立即发送任何数据。

    1. 来自 select() 的信号是否适用于所有数据? (不是部分)。

    所有什么数据? select() 对您的数据了解多少?它告诉你的只是套接字现在变成了可写的,这意味着内核套接字发送缓冲区中有一些空间,这意味着send() 现在将传输至少一个字节。

    1. 来自 select() 的错误是否为套接字故障?

    如果select() 返回 -1,则参数中存在错误或提供给选择集之一的无效 FD:通常是已关闭的。

    【讨论】:

    • (1) 我已经要求 send() 发送这么多数据。 select() 将通知“fd”是否有要报告的内容。
    • 它没有。所以? select() 不知道。系统调用不知道彼此之前的失败,或者提供给这些失败的参数。
    • 那么,我如何知道是否所有数据都已发送?
    • 你知道是因为你从 send() 得到了 EAGAIN/EWOULDBLOCK,或者传输的字节数。
    • 如果您清楚地说明您认为需要调整的内容,我会考虑调整此答案。我自己看不出有什么需要。它回答了您提出的问题。这里的评论基本上是多余的。
    猜你喜欢
    • 2010-10-29
    • 2012-08-09
    • 2010-11-14
    • 1970-01-01
    • 2016-02-21
    • 2013-04-01
    • 2018-11-19
    • 2013-11-13
    • 1970-01-01
    相关资源
    最近更新 更多