【问题标题】:Can a socket listen and connect simultaneously一个套接字可以同时监听和连接吗
【发布时间】:2016-05-25 16:58:08
【问题描述】:

我想设计一个 P2P 网络。这是一个解释我的问题的简化程序。

我想问有没有办法同时连接和接受连接。

如果不是,P2P 网络是否使用两个端口,一个接受,另一个连接。

我正在使用线程,因为我必须在所有机器上运行该程序的示例。这就是为什么我要输入主机和端口。在主线程上,它接受连接和其他连接。

下面的程序给我以下错误:

socket.error: [Errno 106] 传输端点已连接

import socket
from threading import Thread

s = socket.socket()
s.bind(('localhost', 6000))

def rec():
    s.listen(1)
    c, addr = s.accept()
    print 'Connection received from ' , addr

def test():
    host = raw_input("Enter Host address : ")
    port = input("Enter port : ")
    s.connect((host, port))
    print s.getsockname()[0]

def main():
     t = Thread(target=rec, args=())
     t.start()
     test()

if __name__ == '__main__':
    main()

【问题讨论】:

    标签: python multithreading sockets p2p


    【解决方案1】:

    你不能在同一个套接字上监听和连接。监听套接字只能用于接受连接,连接套接字只能是单个双向管道。此外,如果您尝试在多个线程中执行相同的操作(例如 send),则可能会出现交错数据的风险。您的客户端应该打开自己的套接字,跳过绑定,让系统为您分配本地连接端口。

    由于创建的套接字是双向的,因此 P2P 应用程序可以双向通信,并且谁进行连接和谁进行侦听的选择取决于其他因素。例如,您可以让两台 P2P 机器监听,这样任何一方都可以开始对话,但一旦开始,它就会在双向管道上运行。

    zeromq 是一个有趣的消息传递系统,可用于 P2P 协议。它对各种通信模型进行了非常详细的描述,非常值得一读。

    【讨论】:

    • 单双向管道是什么意思?能否请您详细说明。
    • 假设你有两台机器 h1 和 h2。建立连接后,h1 的 send 会以 h2 的 recv 结束,反之亦然。谁开始谈话并不重要。假设您有一个函数def my_p2p_conversation(connected_socket):...,它通过发送和接收来实现您的协议。它有一个监听套接字,如果它收到一个连接请求,它就会运行应用程序 (my_p2p_connection(listen_socket.accept()))。如果用户想要启动连接,它会执行my_p2p_connection(connection_socket.connect(('h2', 9876)))
    • 该答案具有误导性。您显然可以使用 SO_REUSEADDR、SO_REUSEPORT 选项在同一个套接字上侦听和连接。事实上,这是创建 P2P 集合点连接的唯一方法。
    • @user64204 - 不,如果你在一个套接字上调用listen,你就不能在同一个套接字上调用connect,反之亦然。套接字是一种操作系统结构。如果你调用listen,你会得到一个socket,它不能绑定到一个tcp端点,而是用作连接请求的事件源。如果你调用connect,你绑定到一个tcp端点进行通信。 REUSEADDR 和 REUSEPORT 与它没有任何关系。这些用于控制关闭侦听套接字、打开新套接字并尝试绑定到相同的底层地址和端口号时会发生什么。
    • 你可以。就试一试吧。这就是 TCP NAT 打孔的工作原理。您从两个线程在同一个本地套接字上执行(绑定、侦听、接受)和(绑定、连接)。然后,当远程机器执行相同操作时,其中一个获胜。第二个失败。但没关系。只有当套接字在第二个线程中连接时,它才会接受或连接失败
    猜你喜欢
    • 2017-06-09
    • 2016-11-24
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    相关资源
    最近更新 更多