【问题标题】:what does it mean when python socket.sendall returns successfully?python socket.sendall成功返回是什么意思?
【发布时间】:2015-06-30 20:45:27
【问题描述】:

在我的代码中,我写了这样的内容:

try:
    s.sendall(data)
except Exception as e:
    print e

现在,我可以假设如果 sendall 没有抛出任何异常,那么套接字的另一端(其内核)确实收到了“数据”?如果不是,那意味着我需要发送一个对我来说似乎不合理的应用程序确认。

如果我可以假设对方的内核确实收到了“数据”,那么这意味着“sendall”仅在它看到我放入“数据”中的所有字节的 tcp ack 时才返回,但我看不到任何文档为此,相反,通过搜索网络,我觉得我不能假设收到了确认。

【问题讨论】:

    标签: python sockets tcp


    【解决方案1】:

    是的你可以:)

    根据socket.sendall 文档:

    socket.sendall(string[, flags]) 向套接字发送数据。插座 必须连接到远程套接字。可选的标志参数有 与上面的 recv() 含义相同。与 send() 不同,此方法 继续从字符串发送数据,直到所有数据都已发送 或发生错误。成功时不返回任何内容。出错时,一个 引发异常,无法确定有多少数据, 如果有,已成功发送。

    具体来说:

    socket.sendall() 将继续发送所有数据,直到完成或发生错误

    更新:回答您关于正在发生的事情的评论:

    查看socketmodule.c 源代码,它似乎反复尝试“发送所有数据”,直到没有更多数据要发送。您可以在 L3611 } while (len > 0); 上看到这一点。希望这能回答您的问题。

    【讨论】:

    • 谢谢。我读了,我不明白完成发送数据意味着什么。这是否意味着内核已完成发送,或者是否意味着它从服务器获得了确认。通过查看错误代码,我没有看到任何错误说我没有收到确认。
    • 再次感谢。我解释这个的方式是循环一直持续到缓冲区为空而不是直到它收到一个确认。我还在 SO 上找到了这个答案,它说发送不会等待确认。 stackoverflow.com/questions/8218785/…
    • 正确 :) 相信(可能是错误的ACK/NAK 在 TCP 堆栈中较低。在这里,我们正在处理位于 TCP AFAIK 之上的层的 Socket(s)。尝试对您的数据包流进行有线共享:)
    【解决方案2】:

    如果 sendall 没有抛出任何异常,我可以假设套接字的另一端(其内核)确实收到了“数据”吗?

    不,你不能。它只告诉您系统成功发送了数据。它不会等待对等方确认数据(即在操作系统内核接收到的数据),甚至不会等到对等应用程序处理数据。此行为并非特定于 python。

    通常,对等系统内核是否接收到数据并将其放入应用程序套接字缓冲区并不重要。真正重要的是它是否接收并处理了应用程序内部的数据,这可能涉及复杂的事情,例如将数据插入数据库并等待成功提交,甚至将数据转发到另一个系统。而且由于由应用程序决定何时真正处理数据,因此您必须使您的应用程序特定 ACK 以表示处理成功。

    【讨论】:

      猜你喜欢
      • 2018-06-09
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      • 2018-01-31
      • 1970-01-01
      • 2012-09-06
      • 2014-05-16
      • 1970-01-01
      相关资源
      最近更新 更多