2010-06-19 5 views
0

Я пытаюсь создать простую пару программных/клиентских программ. В локальной сети они работают нормально, но когда я пытаюсь подключиться от «снаружи», это говорит о том, что соединение отказалось. Я закрыл брандмауэры на обеих машинах, но я все еще не могу подключиться, и я дважды проверил ip.Я не могу подключиться к сокету извне

Что я делаю неправильно?

Благодаря

Jake

Код:

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

Можете ли вы показать свой код, пожалуйста? –

+1

Вы перенаправили необходимые порты в маршрутизатор? – Felix

+0

Вы уверены, что подключаетесь к машине (например, не к маршрутизатору между ними)? – Stephen

ответ

2

У вас есть одна из двух возможных проблем.

  1. Ошибочное сеть конфигурации
  2. Bug (s) в коде

путь к отладки это, чтобы попытаться исключить одну из них. Если мы сможем избавиться от проблемы с кодом, мы знаем, что это проблема сети.

Получите сервер и клиент Socket, которые вы знаете, и затем попробуйте их как автономные программы. внутри и снаружи брандмауэра. Go to this site и загрузить примеры. Измените порты как на клиенте, так и на сервере, скомпилируйте и запустите их. Сначала на одной машине в сети, второй с двух машин в одной сети, а затем на сервере изнутри и на клиента извне сети.

1

Как это аргумент вы передаете к .bind вызова для вашего серверного сокета? Это одна из наиболее вероятных причин. если вы используете 192.168.x.y для любых значений x и y, или 10.x.y.z, также это адрес локальной сети, а не маршрутизируемый межсетевыми маршрутизаторами посредством интернет-соглашений (большинство маршрутизаторов можно запрограммировать для пересылки некоторых входящих пакетов на конкретный адрес локальной сети, обычно в зависимости от портов, но это очень специфично для брендов и моделей маршрутизатора).

+0

Так что, в основном, мне приходится переправлять порты? – Jake

+0

@ Jake, если ваш компьютер не работает с внешним статическим IP-адресом в общедоступной подсети (то есть ** не ** 192.168.etc или 10.etc), да, пересылка портов с вашего маршрутизатора (у кого был _better_ внешний доступный публичный IP - если не статический, вы можете использовать dyndns или аналогичные службы для улучшения этого) - это путь. Дополнительную информацию см. В статье superuser.com, так как «как лучше всего получить переадресацию портов на эту конкретную модель маршрутизатора» не является вопросом программирования как таковым. –

+1

@ Джейк: Да. Весьма вероятно, что вы локально используете адреса «RFC1918» (это документ предложений стандартов IETF, в котором обсуждается набор зарезервированных адресов, которые используются для изолированных сетей и которые на протяжении многих лет использовались при выполнении NAT (преобразование сетевых адресов) на границах между малыми и домашними локальными сетями и Интернетом. Возможно, ваш интернет-провайдер может блокировать почти произвольные списки портов и типов трафика через свою инфраструктуру маршрутизации по разным причинам. Это менее распространено с лучшими провайдерами и более распространено с кабелем компаний, например. –

Смежные вопросы