2009-07-17 85 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程序?如果是這樣 - 在空閒之外嘗試,看看結果是否有任何不同。

相關問題