Хобрук: Ваш путь к мастерству в программировании

Отправка UDP с одного компьютера на другой в python

У меня есть довольно стандартная простая демонстрация для пакетов udp, но я получаю сообщение об ошибке при попытке отправить на другой IP-адрес, и я действительно не понимаю, почему.

socketerror: [Errno 22] Неверный аргумент

Код, который, как я думал, будет работать, в основном....

Сервер

def Main():
    host = '0.0.0.0'
    port = 20030

    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.bind((host,port))

    #Then it prints incoming data and sends it back to client.
    data,addr = s.recvfrom(1024)
    s.close()

Клиент

def Main():
    host = '127.0.0.1'
    port = 20020

    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.bind((host,port))
    server = ('10.20.64.115', 20030)

    #loop for input to send to server.
    s.sendto(message, server)
    s.close()

Если я запускаю их оба на одном компьютере и host = 127.0.0.1 на обоих, оба привязаны к 127.0.0.1, а s.sendto(message, server) отправляет на 127.0.0.1, они могут отправлять сообщения обратно и без проблем.

Если я запускаю их на разных компьютерах, я считаю, что должен использовать клиент для отправки на IP-адрес IP-адреса сервера, но я получаю [Errno 22].

Поэтому я попытался привязать клиента к 192.0.0.1, который выдал [Errno 99], не может назначить запрошенный адрес.

Я попытался привязать клиента к 0.0.0.0, а адрес sendto к 10.20.64.115, но клиент просто возвращается к новой строке, и сервер ничего не видит.

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

Так что я теперь весь в замешательстве. Исправьте все недоразумения...

bind(IP-адрес, который вы хотите слушать, порт, который вы хотите слушать)

sendto(сообщение, IP-адрес, на который вы хотите отправить, порт, на который вы хотите отправить)

0.0.0.0 слушает все.

192.0.0.1 слушает роутер.

127.0.0.1 слушает только компьютер.

Если да, то какой IP-адрес мне нужно отправить, чтобы избежать ошибки 22 и успешно отправить сообщение на сервер? Или я что-то пропустил с розетками?

02.04.2017

  • какая строка вашего кода генерирует ошибку? Это питон 2 или питон 3? Каково значение message, когда вы получаете сообщение об ошибке? 02.04.2017
  • @jJames K Polk Строка sendto в клиенте получает ошибку. Оба используют версию 2.7. Значение message обычно представляет собой строку из нескольких символов. тест или что-то подобное. 02.04.2017
  • Вы совсем потеряли смысл! UDP Server use 2 port первое прослушивание второе для отправки. В вашем коде серверный порт = 20030 и клиентский порт = 20020, где подключиться/обслуживать? 08.09.2017

Ответы:


1

bind(IP-адрес, который вы хотите слушать, порт, который вы хотите слушать)

При отправке пакетов UDP на стороне клиента не требуется bind() для присоединения своего сокета к адресу, вы можете напрямую использовать sendto() и recvfrom() для отправки и получения сообщений с сервера. Подробнее см. здесь.

02.04.2017
  • Я так не думаю. Я удалил привязку и просто использовал файл sendto. Это не дает мне errno 22, но переходит к следующей строке, и отправляемое сообщение никогда не отображается на сервере. 04.04.2017
  • @JamesKPolk Я только что понял, что когда он переходит к следующей строке, он не сломан или не получает ошибку, он ждет ответа сервера. Часть моего цикла, которую я не включил, заключается в том, что сервер отправляет сообщение обратно. Таким образом, ошибка 22 в этом случае не является проблемой, но сообщение никогда не доходит до сервера, и это то, что я пытаюсь решить. Но я вижу, что проблема не в привязке в клиенте. Так что errno 22, вероятно, не проблема. Вопрос в том, на какой IP-адрес отправлять сообщения. Хотя я до сих пор не понимаю, что происходит. 04.04.2017
  • @JamesKPolk это частично решает эту проблему, теперь он знает, что это не обязательная проблема, как он предполагал раньше, как он упоминал. 05.04.2017
  • Новые материалы

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

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