我有一个程序监听端口,等待少量数据告诉它该做什么。我运行该程序的5个实例,每个端口一个包含5000到5004个。
我有第二个用Python编写的程序,它创建一个套接字“s”,将数据写入端口5000,然后关闭。然后它递增端口号并创建一个连接到5001的新套接字。它一直执行到达5004。
前三个套接字连接工作正常。端口5000到5002上的程序可以很好地接收数据,然后关闭它们!但是,第四个套接字连接导致“连接被拒绝”错误消息。同时,第四个监听程序仍然报告它在端口5003上等待 - 我知道它正在正确监听,因为我可以使用Telnet连接到它。
我尝试更改端口号,每次都是第四次连接失败。
我应该检查的系统是否有一些限制?我只在发送端随时打开一个插槽,而且我可以获得5个中的3个,这消除了我能想到的许多基本故障排除步骤。
有什么想法?谢谢!
---编辑---
我在使用Python 2.6版的CentOS Linux上。这是一些示例代码:
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)
答案 0 :(得分:1)
这听起来很像防火墙的反端口扫描措施。
答案 1 :(得分: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
或许这可以帮助您了解它是否是您的防火墙造成的麻烦。我想你可以尝试将它分成客户端和服务器。
答案 2 :(得分:0)
你是否在Idle内运行第二个Python程序?如果是这样 - 在空闲之外尝试它,看看结果是否有任何不同。