我想设计一个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()
答案 0 :(得分:1)
您无法在同一个套接字上收听和连接。监听套接字只能用于接受连接,而连接套接字只能是单个双向管道。此外,如果您尝试在多个线程中执行相同的操作(例如send
),则存在交错数据的风险。您的客户端应该打开自己的套接字,跳过绑定并让系统为您分配本地连接端口。
由于创建的套接字是双向的,因此P2P应用程序可以双向通信,选择谁进行连接以及谁进行监听是基于其他因素。例如,你可以让两台P2P机器都听,这样任何一方都可以开始谈话,但一旦启动,它就会在双向管道上运行。
zeromq是一个有趣的消息传递系统,可用于P2P协议。它对各种通信模型进行了非常详细的描述,非常值得一读。