Python socket принимает только локальные соединения - PullRequest
4 голосов
/ 19 апреля 2011

Сервер:

import socket

host = ""
port = 4242
backlog = 5
size = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host,port))
s.listen(backlog)
client, address = s.accept()
while 1:

    data = client.recv(size)
    if data:
        client.send(data)
        print(data.decode("utf-8"))

Клиент:

import socket
import sys

host = sys.argv[1]
port = 4242
size = 1024

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
while True:
    line = input("What to say: ")
    s.send(line.encode("utf-8"))

Ну, я немного запутался здесь.Я начинаю изучать сокеты, поэтому я начал с простого эхо-сервера.Код, который я разместил выше, прекрасно работает, когда сервер работает на Arch Linux или Ubuntu.Однако в Windows 7 он принимает только локальные соединения.Дело в том, что я не использую брандмауэр.Я не уверен, есть ли у Python отдельная реализация WinSock или что, но я запутался!Пожалуйста, если хотите, я прекрасно понимаю, что это ужасно разработано (принимает только на клиенте!), Но я просто хочу знать, почему Windows не будет принимать удаленные подключения.Arch и Ubuntu, я работаю на Python 3.1, а на Win 7 - на 3.2.

Ответы [ 2 ]

8 голосов
/ 19 апреля 2011

Похоже, что host='' по умолчанию привязывается к localhost (127.0.0.1) под Win 7 (в данный момент у меня нет доступа к машине с Win 7).

Чтобы сделать ваш сервер доступным для всех (IPv4) интерфейсов на хосте, это должно работать в Linux, Windows, Mac и т. Д.:

host = '0.0.0.0'
s.bind((host, 8080))

Чтобы проверить, к какому адресу относится сокет, вы можете сделать это:

>>> s.getsockname()
('0.0.0.0', 8080)
0 голосов
/ 19 апреля 2011

Как указано в документации для Socket :

Некоторое поведение может зависеть от платформы, поскольку к API сокетов операционной системы обращаются.1008 * Я не знаком с сетевым программированием Win32, но я рискну предположить, что это, вероятно, поведение, специфичное для реализации, которое запускается, когда вы создаете сокет без привязки его к адресу.поднимите уровень абстракции и используйте SocketServer .

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