• Как получить 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
    Ответ написан
    Комментировать
  • Как реализовать наследование от ветви интерфейсов и базовой реализации корневого интерфейса?

    comargo
    @comargo Автор вопроса
    Программист самоучка
    Ответ на вопрос нашел
    https://isocpp.org/wiki/faq/multiple-inheritance#m...
    Узнал что виртуальными бывают не только функции, но и наследования.
    Спасибо.

    Итоговый код:
    class IA {
    public:
      virtual void f1() = 0;
    };
    
    class IB : virtual public IA { // !!! VIRTUAL !!!
    public:
      virtual void f2() = 0;
    };
    
    class A : virtual public IA { // !!! VIRTUAL !!!
    public:
      void f1() {
        std::cout << "f1" << std::endl;
      }
    };
    
    class B :  public IB, public A // А вот тут виртуальность необязательна.
    {
    public:
      void f2() {
        std::cout << "f2" << std::endl;
      }
    };
    
    int main(int argc, char* argv[])
    {
      B b;
      b.f1();
      b.f2();
      return 0;
    }
    Ответ написан
    Комментировать