имя или имя сервера не предоставлены, или не известны по TCP-соединению в Python - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь понять сокет-соединения в python, и каждый раз, когда я пытаюсь подключиться к URL-адресу, он выдает мне эту ошибку:

nodename nor servname provided, or not known

что я понятия не имею, почему? И иногда он показывает только 301 и никогда 200 статус!

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "Whatever url i am giving"
server_address = (host, 80)
request_header = request_header = 'GET / HTTP/1.1\r\nHost: '+host+'\r\n\r\n'

try:
    s.connect(server_address)
    s.send(request_header.encode('utf-8'))
    result = s.recv(4096).decode('utf-8')
    while (len(result) > 0):
       print(result)
       result = s.recv(4096)
except Exception as ex:
    print("Unexpected error:", ex)   


s.close()

Я знаю, что есть другие вопросы, но они не удовлетворяют моему запросу. Может кто-нибудь указать мне, что здесь происходит ??

1 Ответ

0 голосов
/ 19 ноября 2018

Вы не подключаетесь к URL . Вы подключаетесь к хосту. Например, когда я назначаю host = stackoverflow.com, ваш код работает нормально.

Сам слой сокета ничего не знает о URL. URL-адрес включает путь, который вы указываете на HTTP-сервер хоста после подключения. Итак, если вы хотите получить, скажем, URL-адрес "http://stackoverflow.com/questions",, который вы подключаете к хосту" stackoverflow.com ", то укажите это в качестве первой строки в HTTP-запросе:

GET /questions HTTP/1.1\r\n

Этот запрос (к stackoverflow.com) фактически доставит ответ 301. 301 - это ответ перенаправления, сообщающий, что искомый документ доступен с другого хоста или службы. Это все более распространенный ответ, так как большинство сайтов «http» теперь перенаправляют клиента на соответствующую службу «https».

Если указанное вами имя хоста не является допустимым (например, если вы пытаетесь подключиться к «szackoverflow.com»), поиск имени хоста, который выполняется автоматически от вашего имени, завершится неудачей, что приведет к socket.gaierror исключение ("gai" => getaddrinfo). В моей системе Linux это выглядит так:

Unexpected error: [Errno -2] Name or service not known

В другой операционной системе текст, содержащий эту ошибку, может быть сформулирован по-другому.

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