套接字可以同时监听和连接

时间:2016-02-14 21:33:45

标签: python multithreading sockets p2p

我想设计一个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()

1 个答案:

答案 0 :(得分:1)

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

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

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

相关问题