Проблема инициализации TCP-соединения в Python - блокировка и тайм-аут - PullRequest
1 голос
/ 19 октября 2011

Для проекта класса я пытаюсь сделать немного программирования на сокете Python, но сталкиваюсь с очень простой проблемой. Я не могу создать TCP-соединение с моего ноутбука на лабораторный компьютер. (Который я надеюсь использовать в качестве «сервера») Даже не вдаваясь в сценарии, которые я написал, я просто безуспешно пробовал команды интерпретатора строк. На лабораторном компьютере (kh4250-39.cselabs.umn.edu) я набираю в Python следующее:

from socket import *
sock = socket()
sock.bind(('', 8353))
sock.listen(5)
sock.accept()

А потом на ноутбуке набираю:

from socket import *
sock = socket()
sock.connect(('kh4250-39.cselabs.umn.edu', 8353))

В этот момент обе машины блокируются и ничего не делают, пока не истечет время ожидания клиента или я не отправлю SIGINT. Этот код в значительной степени точно скопирован из примеров, которые я нашел в Интернете, и из книги Марка Лутца «Программирование на Python» (использование «» для имени хоста сервера, по-видимому, использует ОС по умолчанию и является довольно распространенным). Если я запускаю оба конца на своем компьютере и использую «localhost» для имени хоста, он работает нормально, поэтому я подозреваю, что это некоторая проблема с именами хостов, которые я использую на одном или обоих концах. Я действительно не уверен, что может пойти не так на таком простом примере. У кого-нибудь есть идея?

Ответы [ 2 ]

1 голос
/ 20 октября 2011

Хороший способ подтвердить, является ли это проблемой брандмауэра или нет, состоит в выполнении telnet из командной строки на целевом хосте, о котором идет речь:

% telnet kh4250-39.cselabs.umn.edu 8353
Trying 128.101.38.44... 

А потом, спустя некоторое время:

telnet: connect to address 128.101.38.44: Connection timed out

Если он просто висит там на Trying, а затем со временем истекает, скорее всего, соединение с удаленным хостом на этом конкретном порту блокируется брандмауэром. Это может быть либо сетевой уровень (например, реальный брандмауэр или список доступа маршрутизатора), либо хост, например iptables или другие механизмы фильтрации на основе хоста.

Доступ к этому узлу лаборатории может быть доступен только из лаборатории или сети кампуса. Поговорите с вашим профессором, сетевым администратором или кем-то «знающим» в сети, чтобы узнать наверняка.

0 голосов
/ 20 октября 2011

Попробуйте связать сервер с 'kh4250-39.cselabs.umn.edu' вместо '':

sock.bind(('kh4250-39.cselabs.umn.edu', 8353))

Если это не работает: Другой причиной может быть брандмауэр, блокирующий порт 8353....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...