当前位置: 首页 > 知识库问答 >
问题:

对等端重置Python连接

相德宇
2023-03-14

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

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)

共有2个答案

巫马山
2023-03-14
newsock, clientaddr = oldsock.accept()
while True:
    print newsock.recv(100), "from", clientaddr[0], "on port", clientaddr[1]

当操作系统在监听端口上接收到连接时,操作系统会将端口切换到新的空闲端口。通过这种方式,您可以在处理刚到达的连接时继续侦听端口以获取新连接。插座accept()将等待连接到来,然后它将返回一个绑定到新端口的新套接字和一个元组(address,port),其中address是客户端的IP,port是OS内部提供的新端口。因此,如果您想取消accept()方法与receive()的关联,则必须将新套接字保存在某个属性中。或者像garph0说的那样把它作为一个论点来传递。

据我记忆所及,当客户端断开连接时,recv()将抛出一个错误。然后你打电话给纽斯托克。close(),或者在希望关闭客户机鼻子上的门时调用它。然后你平静地继续等待新的。

翟泰
2023-03-14

socket。accept()返回发送和接收所需的新套接字对象。看看这些文件。

例如。:

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

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

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

这将使任何新客户机(最多maxconvalue)成功连接,然后排队等待服务,但是这个实现看起来好像在客户机停止连接时就要退出(虽然我没有仔细检查:),所以最好给listen()一个零积压值。

 类似资料:
  • 我正在使用Python,并在给定端口上侦听UDP数据包,一切似乎都很好地工作-但经过较长时间后,脚本崩溃,出现以下错误: 当重新启动脚本时,相同的崩溃会在较短的时间后再次发生。相反,重新启动服务器似乎可以再次完全解决问题。 关于插座方面的事情,我正在做: 我是否遗漏了一些显而易见的东西,或者只是有一个简单的方法来避免这种情况? 提前感谢您提供的任何信息! 本吉

  • 调试此程序时遇到一些问题。我总是在第一次启动我的应用程序时出现这个错误,然后间歇性地出现。有人能帮我扔掉一些调试技巧吗?我试过使用代理检查器,但没有用,我没有看到任何有用的东西。我尝试过在django设置中设置我的站点URL的建议。我尝试了使用和不使用http://以及使用和不使用端口。。。下面是一个毫无帮助的错误: 即使有了这个连接重置,这个应用程序似乎也能正常运行,但它一直让我疯狂地试图调试。

  • 我在RabbitMQ上犯了stainger错误。我发送了一些关于MQ和Php产品的信息,但出现了一些问题。我可以在出现异常“errno=104由对等方重置连接”的一分钟后发送消息。见下文: rabbitmq-3.6的版本。1,php-7.0版本。5,php amqp库的版本-“Videlavaro/php amqplib”:“~2.7 来自rabbitmq的日志:

  • 问题内容: 我设置rabbitmqserver并使用以下步骤添加了用户: 我的celery配置是这样的: 我的代码是这样的: 当我尝试跑步时 我懂了 一切看起来都很完美!有人可以帮我我在这里想念的吗? 问题答案: 一旦我将代码部署到生产环境并将Celery升级到3.1.12,问题就解决了。我最初使用3.0.19,但后来进行了升级,但没有发现任何问题。感谢您的支持。

  • 我在使用netty作为http提供者的异步http客户端时遇到了一个奇怪的问题,它是一个调用远程web服务的play应用程序,而我们没有访问权限。还需要注意的是,该服务位于SSL加密的域上,并且只转发到该域,而不转发到IP。堆栈跟踪: 最奇怪的是,这是突然发生的(这是一个客户使用的测试环境),这让我相信接收服务或网络出了问题,但我无法发现哪里出了问题,因为使用curl调用同一个url可以正常工作。

  • 问题内容: 我的许多node.js进程都因ECONNRESET错误而崩溃。这是我可以看到的输出: 有人知道如何处理吗?这不是一个非常有用的堆栈跟踪,所以我不知道它在哪里发生。我是否应该使用try / catch块包装通过http访问远程源的所有访问权限?或者,还有更好的方法? 通常,我不关心是否会发生这种情况,或者是否因此而无法完成某些任务。我关心的是,该过程应该将其忽略,然后继续执行下一个任务。