Почему я не получаю пакеты UDP, отправленные на мой собственный IP? - PullRequest
0 голосов
/ 25 августа 2009

Я написал эту программу ruby ​​для отправки пакета UDP на порт 16800:

require 'socket'
sock = UDPSocket.new
sock.bind("", 47123) 
sock.send("Hello!", 0, "192.168.0.100", 16800)
sock.close

, где 192.168.0.100 - мой собственный IP-адрес. Однако пакет не отображается в Wireshark, и мой UDP-сервер, прослушивающий порт 16800 на том же ПК (под управлением Linux), ничего не получает.

Когда я слегка переписываю программу на

require 'socket'
sock = UDPSocket.new
sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, true)
sock.bind("", 47123) 
sock.send("Hello!", 0, "<broadcast>", 16800)
sock.close

пакет отображается в Wireshark, но мой сервер все еще ничего не получает.

Я что-то упускаю из виду?

EDIT: Код сервера, для полноты

require 'socket'
sock = UDPSocket.new
sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, true)
sock.bind(nil, 16800)
while true
    packet = sock.recvfrom(1024)
    puts packet
end

Однако, это было скопировано где-то из Интернета, и при редактировании его для stackoverflow я обнаружил, что сервер всегда получает пакеты, отправленные на 127.0.0.1, но когда я изменяю nil на "", сервер неожиданно также получает пакеты отправлено выше. Это ошибка в реализации сокета ruby?

Ответы [ 5 ]

1 голос
/ 25 августа 2009

Я только что использовал ваш код, и проблема в том, что вы не привязываетесь к определенному IP-адресу. Я не знаю о Linux, но в OS X есть проблема, когда иногда по умолчанию будет добавляться неиспользуемый адрес IP6, а не интерфейс, который вы ожидали.

Изменение "" на 192.168.1.255 на сервере и включение "192.168.1.255" на привязке в клиенте сделали всю эту работу для меня:)

1 голос
/ 25 августа 2009

UDPSocket.BIND принимает хост и порт. Попробуйте изменить ноль на ваш IP-адрес. С http://coderrr.wordpress.com/2008/05/28/get-your-local-ip-address/; используйте

require 'socket'

def local_ip  
  orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true  # turn off reverse DNS resolution temporarily  

  UDPSocket.open do |s|  
    s.connect '64.233.187.99', 1  
    s.addr.last  
  end  
ensure  
  Socket.do_not_reverse_lookup = orig  
end

чтобы получить ваш IP

0 голосов
/ 12 октября 2009

Если такое соединение должно работать, и вы видите пакеты, использующие Wireshark, то вам также следует проверить программный брандмауэр на вашем компьютере. Если он блокирует трафик на порт UDP, который вы хотите использовать, вы все равно можете увидеть пакет, используя Wireshark!

0 голосов
/ 25 августа 2009

Здесь можно подумать, но вы можете рассмотреть что-то вроде этого - когда вы используете собственный IP-адрес компьютера, пакеты не видны на физическом канале b / c, стек tcp / ip не нужно проталкивать они настолько далеко, что могут привести их туда, куда они направляются, он может повернуть их внутренне к компьютеру на одном из более высоких уровней в этой семислойной модели стека (возможно, «транспортный» уровень)

0 голосов
/ 25 августа 2009

Вы пытались отправить на "localhost" или "127.0.0.1"? Это отправит непосредственно на локальный компьютер и поможет диагностировать проблему дальше.

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