2010-06-19 3 views
0

J'essaie de faire une simple paire de programmes serveur/client. Sur LAN ils fonctionnent bien, mais quand j'essaye de me connecter de "l'extérieur" il dit que la connexion a été refusée. J'ai éteint les firewalls sur les deux machines mais je suis toujours incapable de me connecter, et j'ai vérifié l'ip.Je ne peux pas me connecter à la prise de l'extérieur

Qu'est-ce que je fais de mal?

Merci

Jake

code:

import socket 
host = '' 
port = 9888 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((host,port))  
s.listen(1) 
conn, adrr = s.accept() 
conn.send("Hello, world!") 
s.close() 

Client: 
import socket 
host = '68.x.x.x' 
port = 9888 
s = socket.socket(socket.AF_INET, socket_SOCK_STREAM) 
s.connect((host,port)) 
print s.recv(200) 
s.close() 
+0

Pouvez-vous montrer votre code, s'il vous plaît? –

+1

Avez-vous transmis les ports requis dans votre routeur? – Felix

+0

Vous êtes sûr que vous vous connectez à la machine (par exemple, pas un routeur entre les deux)? – Stephen

Répondre

2

Vous avez l'un des deux problèmes possibles.

  1. configuration réseau Erroneous
  2. Bug (s) dans le code

La façon de déboguer est d'essayer de gouverner un. Si nous pouvons nous débarrasser du problème du code, nous savons qu'il s'agit d'un problème de réseau. Obtenez un serveur socket et un client que vous connaissez fonctionne et ensuite les essayer en tant que programmes autonomes. à l'intérieur et à l'extérieur du pare-feu. Go to this site et télécharger les exemples. Changez les ports du client et du serveur, compilez-les et exécutez-les. D'abord sur la même machine au sein du réseau, ensuite à partir de deux machines sur le même réseau, puis du serveur de l'intérieur et du client de l'extérieur du réseau.

1

Comment est l'argument vous passez à l'.bind appel à votre socket serveur? C'est la cause la plus probable - par ex. si vous utilisez 192.168.x.y pour les valeurs x et y, ou 10.x.y.z, il s'agit également d'une adresse de réseau local non routée par des routeurs inter-réseaux par des conventions Internet (la plupart des routeurs peuvent être programmés pour transférer certains paquets entrants vers un adresse de réseau local, généralement en fonction des ports, mais cela est très spécifique aux marques et aux modèles de routeur).

+0

Donc, fondamentalement, je dois transférer les ports? – Jake

+0

@Jake, sauf si votre ordinateur fonctionne avec une adresse IP statique accessible de l'extérieur sur un sous-réseau public (par exemple, ** pas ** 192.168.etc ou 10.etc), oui, le transfert de port à partir de votre routeur (qui avait _better_ une adresse IP publique accessible de l'extérieur - si elle n'est pas statique, vous pouvez utiliser dyndns ou des services similaires pour améliorer cela) est la voie à suivre. Voir superuser.com pour plus de détails, comme "comment puis-je obtenir le meilleur transfert de port sur ce modèle de routeur" n'est pas une question de programmation en soi. –

+1

@Jake: Oui. Il est très probable que vous utilisiez localement les adresses "RFC1918" (c'est le document de proposition de normes IETF qui discute des ensembles d'adresses réservées utilisées pour les réseaux isolés et qui, au fil des années, ont été utilisées pour la NAT). Il est possible que votre fournisseur de services Internet bloque des listes de ports et de types de trafic presque arbitraires via son infrastructure de routage pour diverses raisons, ce qui est moins courant avec les meilleurs FAI et plus commun avec le câble. les entreprises, par exemple. –

Questions connexes