【发布时间】: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 Ask 和 What can I ask about here?。您可以在那里的代码中看到
wait()的定义。为什么它做它做的事?我不知道。我觉得有点奇怪。虽然self_broken为假,但它发送"starting"以响应它收到的任何内容(恕我直言,这做得不好)。如果self_broken为 True,它将始终发送"broken"并且永远不会停止,因为没有人会将其设置回 False。 -
另外两个,
c.close()和c.send()是套接字/文件描述符操作。第一个关闭套接字。后者将通过套接字发送数据。正如我所说,这对于网络协议来说并不是很好的形式。似乎没有任何消息分隔符,并且您依赖于作为整个单元交付的数据 - 由于 TCP 是流接口,而不是面向消息的接口,因此无法保证。哦,我看到您实际上是在询问c与实际例程。c是接受的套接字连接,它被传递到等待以便它可以使用它。
标签: python