Пытаюсь принимать широковещательный UDP трафик (маска /24, .255). При этом адрес источника такой же — .255. И wireshark на винде, и tcpdump на линуксе показывают одно и то же. Это вообще нормально?
При этом моя линуксовая софтина в упор не видит этот трафик (читаю питоновскими 2.7 сокетами). Есть также софт эмулятор источника трафика, под винду. С него трафик идет с конкретного адреса, и моя софтина его нормально читает.
Где может быть проблема? В линуксе, в питоновских сокетах? Или то, что адрес источника равен адресу назначения — 192.168.0.255 для линукса и питона рояли не играет, и проблема где-то у меня?
# создаются сокеты как-то так:
def add_sock(address):
try:
sk = socket(AF_INET, SOCK_DGRAM)
sk.bind(address)
except Exception as e:
print 'Error: can\'t init socket: %s' % e
sys.exit(1)
sockets.append(sk)
sock_num[sk] = add_sock.num # Channel ID
add_sock.num += 1
# чтение реализовано так:
rx, tx, xx = select(sockets, [], [], 10.0)
for sk in rx:
pkt, addr = sk.recvfrom(mtu)
...
PS mtu определяется ранее и в итоге равно 1472. При этом длина пакетов, которые принимаются нормально — 1488, длина пакетов, которые не принимаются — 1420
Здравствуйте, Marty, Вы писали:
M>Где может быть проблема? В линуксе, в питоновских сокетах? Или то, что адрес источника равен адресу назначения — 192.168.0.255 для линукса и питона рояли не играет, и проблема где-то у меня?
Может в том, что это броадкастовые пакеты? А Вы не установили опцию приема броадкастовых данных.
Здравствуйте, Nikolay_Ch, Вы писали:
M>>Где может быть проблема? В линуксе, в питоновских сокетах? Или то, что адрес источника равен адресу назначения — 192.168.0.255 для линукса и питона рояли не играет, и проблема где-то у меня? N_C>Может в том, что это броадкастовые пакеты? А Вы не установили опцию приема броадкастовых данных.
Может вы внимательнее прочитаете мое сообщение, и поймете, что меня напрягает адрес источника, который равен бродкастному адресу назначения?
Здравствуйте, andrey.desman, Вы писали:
AD>См. жирным. address хоть бродкастовый (192.168.0.255)?
Нет, обычный адрес 192.168.0.1
SO_BROADCAST вроде отвечает за передачу бродкастов (прием всегда должен работать). Эта опция устанавливается, так как с сокета еще и рассылка производится, но проблема с приемом.
Здравствуйте, Marty, Вы писали:
M> Пытаюсь принимать широковещательный UDP трафик (маска /24, .255). При этом адрес источника такой же — .255. И wireshark на винде, и tcpdump на линуксе показывают одно и то же. Это вообще нормально?
Вроде решилась проблема — пнул разработчиков той подсистемы, теперь пакеты идут с нормальным адресом источника, и нормально принимаются. Вообще непонятно, разве так можно нормальными средствами сделать? Хотя, у них там QNS, может там и можно.
Но вообще интересно, кто эти пакеты отбрасывал? Линуксовый TCP-стек?
Здравствуйте, Marty, Вы писали:
M>SO_BROADCAST вроде отвечает за передачу бродкастов (прием всегда должен работать). Эта опция устанавливается, так как с сокета еще и рассылка производится, но проблема с приемом.
Здравствуйте, andrey.desman, Вы писали:
M>>SO_BROADCAST вроде отвечает за передачу бродкастов (прием всегда должен работать). Эта опция устанавливается, так как с сокета еще и рассылка производится, но проблема с приемом.
AD>За прием тоже отвечает.
Может я и ошибаюсь. Но микрософт тоже вроде о приеме только говорит:
The state of the SO_BROADCAST socket option determines whether broadcast messages can be transmitted over a datagram socket. This socket option applies only to datagram sockets.
Здравствуйте, andrey.desman, Вы писали:
AD>Здравствуйте, Nikolay_Ch, Вы писали:
AD>>>address хоть бродкастовый (192.168.0.255)? N_C>>Биндить на броадкастовый нельзя.
AD>Почему?
Согласен — сморозил, беру свои слова назад....
Для приёма бродкаста — локальный сокет биндится на 0.0.0.0
Для приёма обычного пакета — биндится на конкретный адрес, типа 192.168.1.1
Так создав и забиндив несколько сокетов — один на 0.0.0.0, остальные — на существующие IP-адреса сетевых карт, при условии что порт везде одинаковый мы сможем ловить и бродкасты и одиночные пакеты.
Причём понять что был словлен именно бродкастовый пакет можно по локальному адресу биндинга (0.0.0.0).
Здравствуйте, sunheretic13, Вы писали:
S>Для приёма бродкаста — локальный сокет биндится на 0.0.0.0 S>Для приёма обычного пакета — биндится на конкретный адрес, типа 192.168.1.1
Не-не-не, броадкастинг тут будет не при чём.
Если мы забиндимся на нулевой адрес, то будем принимать пакеты, пришедшие на любой из сетевых адаптеров нашего компьютера.
Если мы забиндимся на конкретный IP, то будем принимать только пакеты с адаптеров, имеющих ассоциацию с данным IP (а таких адаптеров в нашем компьютере может быть более одного в случае если на данный IP делается что-то типа ethernet bonding).
Здравствуйте, Marty, Вы писали:
M>Вроде решилась проблема — пнул разработчиков той подсистемы, теперь пакеты идут с нормальным адресом источника, и нормально принимаются. Вообще непонятно, разве так можно нормальными средствами сделать? Хотя, у них там QNS, может там и можно.
Сталкивался с одной VoIP железкой, которая при a=sendonly отправляла свой RTP поток с порта 0. Иногда такие интересности в стеке бывают...
M>Но вообще интересно, кто эти пакеты отбрасывал? Линуксовый TCP-стек?