recv和recvfrom,使用python的socket编程

新手上路,请多包涵

我是 python 的新手,也是套接字编程的新手。

我对 socket.recvfrom()socket.recv() 感到困惑

我知道通常对于 UDP,人们使用 recvfrom() 而对于 TCP,人们使用 recv()

例如,

 serverSocketUDP = socket(AF_INET, SOCK_DGRAM)
serverSocketTCP = socket(AF_INET, SOCK_STREAM)
#... define server...
#...
message, clientAddress = serverSocketUDP.recvfrom(2048) #why 2048 for UDP? Ive seen several examples like this.
message2 = serverSocketTCP.recv(1024) #Again, why 1024 for TCP?

如上例所示,我感到困惑的是数字。为什么 2048 和 1024 用于不同的协议?这些数字代表什么?请解释。我希望我足够清楚。谢谢你。

原文由 user859385 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

为什么 2048 和 1024 用于不同的协议?

这些是非常随意的数字,取决于正在实施的协议。即使 TCP 号码有效,您提供的 UDP 号码也很可能是错误的。

TCP 实现了一种流协议,您可以读取任何大小的数据块。你可以做 recv(1) 一次获取一个字节,或者 recv(100000) 如果你想抓取大块。 recv 可以免费返回您要求的较小块,因此您可能会得到与您想要的不同的大小。 1024 非常小,您可以毫无问题地读取更大的块。

UDP 实现消息协议。您必须要求足够的字节来覆盖整个消息,否则它将被丢弃。该大小取决于协议。协议将消息限制为 1500(标准以太网数据包的最大大小)是很常见的,但它可以是任何高达 65535 的消息。检查实际协议规范以了解最大值。

原文由 tdelaney 发布,翻译遵循 CC BY-SA 3.0 许可协议

你让他们交换了。 TCP 套接字应使用 socket.recv UDP 套接字应使用 socket.recvfrom 。这是因为 TCP 是面向连接的协议。一旦创建连接,它就不会改变。另一方面,UDP 是一种无连接(“发送后忘记”)协议。您使用 recvfrom 所以您知道应该将数据发回给谁。 Recvfrom 在 TCP 套接字上的工作方式不同。

至于 1024/2048,这些代表您要接受的字节数。一般来说,UDP 的开销比 TCP 少,允许您接收更多数据,但这不是严格的规则,在这种情况下几乎可以忽略不计。您可以随心所欲地接收尽可能多的或尽可能少的。 4096 也很常见(对于两者)。

原文由 Goodies 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题