【问题标题】:SOL_SOCKET and SOL_REUSESOL_SOCKET 和 SOL_REUSE
【发布时间】:2018-04-30 09:02:47
【问题描述】:

我正在尝试为 p2p 通信设置一个套接字。 A 我找到了这段代码,但我很难理解代码。 SOL_SOCKET 以及 SOL_REUSE 是什么?

有人可以帮我看一下这段代码吗?

#!/usr/bin/env python
import socket, sys

self_broken = False

def wait(c):
    print('waiting...')
    c.send('waiting')
    broken = True
    while broken:
        status = c.recv(1024)
        if status == 'working':
            print(status)
            if self_broken:
                c.send('broken')
            else:
                c.send('starting')
                broken = False
    c.close()

def main():
    s = socket.socket()
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    host, port = socket.gethostname(), 10001
    s.bind((host, port))
    s.listen(1)
    while True:
        c, addr = s.accept()
        status = c.recv(1024)
        print(addr[0] + ':' + str(addr[1]) + ' > ' + status)
        if status == 'broken':
            wait(c)
        else:
            print(status)
        c.close()
    s.close()

main()

我找到了这个解释,但它是针对 C 的,它也适用于 Python 吗? This is for C, is it the same for Python?

编辑: 谁能告诉我'c'是做什么的?它在等待(c)、c.send 和 c.close 中。

【问题讨论】:

  • 是的,是一样的。当涉及到系统级的东西时,Python 试图只提供一个围绕系统 API 的薄包装器。手册页中的很多内容都适用。有一点不同的是实际设置选项的机制——当结构被传递给系统 API 时,通常会有一些调整——所以最好也看看相关的 Python 文档。
  • 您正在涉足与 Stack Overflow 无关的领域。请参阅 How to AskWhat can I ask about here?。您可以在那里的代码中看到wait() 的定义。为什么它做它做的事?我不知道。我觉得有点奇怪。虽然self_broken 为假,但它发送"starting" 以响应它收到的任何内容(恕我直言,这做得不好)。如果 self_broken 为 True,它将始终发送 "broken" 并且永远不会停止,因为没有人会将其设置回 False。
  • 另外两个,c.close()c.send() 是套接字/文件描述符操作。第一个关闭套接字。后者将通过套接字发送数据。正如我所说,这对于网络协议来说并不是很好的形式。似乎没有任何消息分隔符,并且您依赖于作为整个单元交付的数据 - 由于 TCP 是流接口,而不是面向消息的接口,因此无法保证。哦,我看到您实际上是在询问 c 与实际例程。 c 是接受的套接字连接,它被传递到等待以便它可以使用它。

标签: python


【解决方案1】:

SOL_SOCKET - 这定义了协议级别(这里是套接字级别)。由整数常量 SOL_SOCKET 表示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-26
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 2011-02-17
    相关资源
    最近更新 更多