繁体   English   中英

对等点重置Python连接

[英]Python Connection Reset by Peer

我正在尝试进行简单的主机/客户端传输。 我遵循了一个教程,服务器正常运行,但是当客户端尝试连接时,它返回“对等连接重置”。 老实说,我不知道错误在哪里。

class genSocket:

def __init__(self, sock=None):
    if sock is None:
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    else:
        self.sock = sock

def bind(self, ip, port):
    self.sock.bind((ip, port))

def listen(self, maxcon):
    self.sock.listen(maxcon)
    while True:
        self.sock.accept()

def accept(self):
    self.sock.accept()
    while True:
        print (self.recieve())

def connect(self, host, port):
    self.sock.connect((host, port))

def send(self, msg, type):
    totalsent = 0
    prefix = str(type) + str(len(msg)).rjust(5, '0')
    print prefix
    while totalsent < 6:
        sent = self.sock.send(prefix)
        if sent == 0:
            raise RuntimeError("Connection broken!")

    print "sent prefix"

    totalsent = 0
    while totalsent < len(msg):
        sent = self.sock.send(msg[totalsent:])
        if sent == 0:
            raise RuntimeError("Connection broken!")
        totalsent = + sent

def recieve(self):
    bytes_recd = 0
    while bytes_recd < 6:
        prefix = self.sock.recv(6)
        if prefix == '':
            raise RuntimeError("Connection broken!")
        prefix.append(prefix)
        bytes_recd = + len(prefix)

    print "recieved prefix"

    chunks = []
    msglen = prefix[1:]
    bytes_recd = 0
    while bytes_recd < msglen:
        chunk = self.sock.recv(min(msglen - bytes_recd, 2048))
        if chunk == '':
            raise RuntimeError("Connection broken!")
        chunks.append(chunk)
        bytes_recd = + len(chunk)
    return ''.join(chunks)

socket.accept()将返回一个新的套接字对象,您需要使用该对象进行发送和接收。 看一下文档

例如:

def accept(self):
    conn, addr = self.sock.accept()
    while True:
        print (self.recieve(conn))

并更改self.recieve()以使用新的套接字。

同样,该实现不会在服务第一个新客户端时接受任何新客户端,但是您可以为listen()调用指定大于零的maxcon值。

这将使任何新客户端(最大为maxcon值)成功连接,然后排队等待服务,但是这种实现方式看起来像是在客户端停止连接时就退出了(尽管我没有仔细检查,但是: )),因此最好将listlog listen()积压值设为零。

newsock, clientaddr = oldsock.accept()
while True:
    print newsock.recv(100), "from", clientaddr[0], "on port", clientaddr[1]

当OS在侦听端口上接收到连接时,OS会将端口切换为新的空闲端口。 这样,您可以在与刚到达的端口一起工作时继续侦听端口的新连接。 socket.accept()将等待,直到该连接到来,然后它将为您返回绑定到新端口的新套接字和一个元组(地址,端口),其中地址是客户端的IP,而端口是操作系统的新端口内部给予。 因此,如果您打算将accept()方法与receive()取消关联,则必须将该新套接字保存在某个属性中。 或将其作为garph0所说的参数传递。

据我所知,当客户端断开连接时,recv()将引发错误。 然后,您调用newsock.close(),或者在您希望关闭客户鼻子的门时调用它。 然后,您从容地继续等待新的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM