Ответы пользователя по тегу C
  • Как получить UDP broadcast пакет из "чужой" подсети?

    comargo
    @comargo Автор вопроса
    Программист самоучка
    В общем в итоге я натравил на Pleora strace.
    Ответ интересный (для меня):
    Создается два сокета (с флагом REUSEADDR):
    1. с привязкой к IP адресу
    2. Без привязки к IP адресу, но с привязкой к порту полученному из первого сокета

    Пакеты уходят через первый сокет, а читаются через второй.
    <код из strace>
    socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 3
    setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
    bind(3, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("192.168.42.1")}, 16) = 0
    setsockopt(3, SOL_SOCKET, SO_BROADCAST, [1], 4) = 0
    getsockname(3, {sa_family=AF_INET, sin_port=htons(43861), sin_addr=inet_addr("192.168.42.1")}, [16]) = 0
    socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 4
    setsockopt(4, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
    bind(4, {sa_family=AF_INET, sin_port=htons(43861), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
    sendto(3, "B\21\0\2\0\0P\1", 8, 0, {sa_family=AF_INET, sin_port=htons(3956), sin_addr=inet_addr("255.255.255.255")}, 16) = 8
    nanosleep({0, 200000000}, NULL)         = 0
    recvfrom(4, "\0\0\0\3\0\370P\1\0\1\0\2\200\0\0\1\0\0\0\21\34\0\352C\0\0\0\7\0\0\0\7"..., 256, 0, {sa_family=AF_INET, sin_port=htons(3956), sin_addr=inet_addr("10.0.0.234")}, [16]) = 256
    Ответ написан
    Комментировать