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

2 投票
3 回答
4502 浏览
提问于 2025-04-15 12:59

我有一个程序,它在一个端口上监听,等待一些小数据来告诉它该做什么。我运行了5个这个程序的实例,每个实例分别在5000到5004的端口上。

我还有一个用Python写的第二个程序,它创建了一个叫“s”的套接字,然后把数据写入5000端口,写完后就关闭。接着,它把端口号加1,创建一个新的套接字连接到5001。它会一直这样做,直到连接到5004。

前面三个套接字连接都没问题,5000到5002端口上的程序都能正常接收到数据,然后继续运行!但是,第四个套接字连接却出现了“连接被拒绝”的错误信息。与此同时,第四个监听程序仍然报告它在5003端口上等待连接——我知道它在正常监听,因为我用Telnet可以连接上它。

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

我应该检查系统中是否有什么限制吗?在发送端,我每次只打开一个套接字,而且我能成功连接到5个中的3个,这让我想不出太多基本的故障排除步骤。

有什么想法吗?谢谢!

--- 编辑 ---

我在使用CentOS Linux,Python版本是2.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)

3 个回答

0

你是在Idle这个环境里运行第二个Python程序吗?如果是的话,试着在Idle外面运行看看结果有没有什么不同。

1

我对网络套接字了解得不多,所以这可能不是很好的写法……使用时请自行判断风险。这个代码:

#!/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()

应该输出:

listening on port 10000
listening on port 10001
listening on port 10002
listening on port 10003
listening on port 10004
sending "ping" to port 10000
reply was: echo ping
sending "ping" to port 10001
reply was: echo ping
sending "ping" to port 10002
reply was: echo ping
sending "ping" to port 10003
reply was: echo ping
sending "ping" to port 10004
reply was: echo ping

也许这能帮助你判断是不是防火墙在捣乱。我想你也可以试着把它分成客户端和服务器来看看。

1

这听起来很像是你的防火墙在启动防止端口扫描的措施。

撰写回答