2009-07-17 10 views
2

J'ai un programme qui écoute sur un port en attente d'une petite quantité de données pour lui dire quoi faire. Je cours 5 instances de ce programme, une sur chaque port de 5000 à 5004 inclusivement.Connexion refusée lors de la tentative d'ouverture, d'écriture et de fermeture d'une socket plusieurs fois (Python)

J'ai un deuxième programme écrit en Python qui crée un socket "s", écrit les données sur le port 5000, puis se ferme. Il incrémente ensuite le numéro de port et crée un nouveau socket connecté à 5001. Il le fait jusqu'à ce qu'il atteigne 5004.

Les trois premières connexions de socket fonctionnent très bien. Les programmes sur les ports 5000 à 5002 reçoivent les données très bien et ils partent! Toutefois, la quatrième connexion de socket entraîne un message d'erreur «Connexion refusée». Pendant ce temps, le quatrième programme d'écoute rapporte toujours qu'il attend sur le port 5003 - je sais qu'il écoute correctement parce que je suis capable de me connecter à l'aide de Telnet.

J'ai essayé de changer les numéros de port, et chaque fois c'est la quatrième connexion qui échoue.

Y at-il une limite dans le système que je devrais vérifier? Je n'ai qu'un seul socket ouvert à tout moment du côté de l'envoi, et le fait que je puisse en obtenir 3 sur 5 élimine beaucoup des étapes de dépannage de base auxquelles je peux penser.

Des pensées? Merci!

--- EDIT ---

Je suis sur CentOS Linux avec la version Python 2.6. Voici quelques exemples de code.

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

Il n'y a vraiment pas assez d'informations pour résoudre ce problème. Essayez de l'affiner avec de petits scripts qui ne font que des choses de base, et si vous ne pouvez toujours pas le comprendre, incluez ces scripts simples. –

+0

Quelle version de python utilisez-vous? Et sur quelle plateforme (os)? –

+0

Cela ressemble à un bug dans votre programme, pas beaucoup nous pouvons vous aider à moins que vous pouvez montrer du code. Vous pouvez cependant déboguer un peu avec le programme netstat, qui montrera les états de connexion de tous les processus sur votre machine. – nos

Répondre

1

Cela ressemble beaucoup à la mesure anti-portscan de votre pare-feu coups de pied dans

1

Je ne sais pas beaucoup sur les sockets, donc cela peut être un style vraiment mauvais. .. utilisez à vos risques et périls. Ce code:

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

devrait sortie:

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 

peut-être cela vous aidera à voir si c'est votre pare-feu causant des ennuis. Je suppose que vous pourriez essayer de scinder cela en client et serveur.

+1

Dans les exemples de socket dans les documents de la bibliothèque Python, ils ne sont pas envoyés sans réception. Les sockets peuvent être difficiles, donc tous les paquets sont tamponnés jusqu'à l'appel de socket.recv() et après son troisième port, le buffer est plein et reste bloqué dans un état d'attente. –

0

Exécutez-vous le 2ème programme Python depuis Idle? Si oui, essayez-le en dehors de Idle et voyez si les résultats sont différents.