尝试打开、写入和关闭套接字几次时连接被拒绝(Python)

2024-10-01 09:22:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个程序可以监听端口,等待少量数据来告诉它该怎么做。我运行该程序的5个实例,在5000到5004的每个端口上运行一个。在

我有一个用Python编写的第二个程序,它创建一个套接字“s”,将数据写入端口5000,然后关闭。然后它增加端口号,并创建一个连接到5001的新套接字。直到达到5004。在

只需三个连接就行了。端口5000到5002上的程序接收到的数据很好,然后关闭!但是,第四个套接字连接会导致一个“connectiondeclined”错误消息。同时,第四个监听程序仍然报告它正在等待端口5003——我知道它正在正常监听,因为我可以使用Telnet连接到它。在

我尝试过更改端口号,每次都是第四个连接失败。在

我应该检查一下这个系统有什么限制吗?我在发送端的任何时候都只打开一个插座,而且我可以通过5个插座中的3个,这样就省去了我能想到的许多基本的故障排除步骤。在

有什么想法吗?谢谢!在

---编辑---

我在CentOS Linux上运行Python2.6版。下面是一些示例代码:

try:
        portno = 5000
        for index, data in enumerate(data_list):
                s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                s.connect(('myhostname', portno))
                s.sendall(data)
                s.close()
                portno = portno + 1
except socket.error, (value,message):
        print 'Error: Send could not be performed.\nPort: ' + str(portno) + '\nMessage: ' + message
        sys.exit(2)

Tags: 数据实例端口程序消息messagedata报告
3条回答

这听起来很像防火墙的反端口扫描措施。在

我对插座不太了解,所以这可能是很糟糕的风格。。。使用风险自负。此代码:

#!/usr/bin/python
import threading, time
from socket import *
portrange = range(10000,10005)

class Sock(threading.Thread):
    def __init__(self, port):
        self.port = port
        threading.Thread.__init__ ( self )

    def start(self):
        self.s = socket(AF_INET, SOCK_STREAM)
        self.s.bind(("localhost", self.port))
        self.s.listen(1)
        print "listening on port %i"%self.port
        threading.Thread.start(self)
    def run(self):
        # wait for client to connect
        connection, address = self.s.accept()
        data = True
        while data:
            data = connection.recv(1024)
            if data:
                connection.send('echo %s'%(data))
        connection.close()

socketHandles = [Sock(port) for port in portrange]

for sock in socketHandles:
    sock.start()

# time.sleep(0.5)

for port in portrange:
    print 'sending "ping" to port %i'%port
    s = socket(AF_INET, SOCK_STREAM) 
    s.connect(("localhost", port))
    s.send('ping')
    data = s.recv(1024)
    print 'reply was: %s'%data
    s.close()

应输出:

^{pr2}$

也许这可以帮助你看看是不是你的防火墙惹了麻烦。我想你可以试着把它分成客户机和服务器。在

你在Idle中运行第二个Python程序吗?如果是这样-在空闲状态下尝试,看看结果是否有任何不同。在

相关问题 更多 >