2009-07-17 63 views
2

我有一个程序侦听等待少量数据的端口,告诉它该做什么。我运行该程序的5个实例,每个端口从5000到5004包含一个。当尝试打开,写入和关闭套接字几次时(Python),连接被拒绝

我有用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) 
+3

真的没有足够的信息来有效地解决这个问题。尝试使用基本套接字的小脚本缩小范围,如果仍然无法弄清楚,请包含这些简单的脚本。 – 2009-07-17 20:41:14

+0

你运行的是哪个版本的python?并在哪个平台(操作系统)? – 2009-07-17 20:45:03

回答

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 

也许这将帮助你看它是否是防火墙导致的麻烦。我想你可以尝试将它分解为客户端和服务器。

0

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

相关问题