1. C++ / Говнокод #20053

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    u_long thisIp = htonl(this->sockaddr.sin_addr.S_un.S_addr);
        u_long otherIp = htonl(other.sockaddr.sin_addr.S_un.S_addr);
        u_short thisPort = htons(this->sockaddr.sin_port);
        u_short otherPort = htons(other.sockaddr.sin_port);
    
        // ip1 + port1 < ip2 + port2
        if (thisIp < otherIp)
        {
            if (thisPort <= otherPort)
            {
                return true;
            }
            else
            {
                return ((unsigned)(thisPort - otherPort) < (unsigned)(otherIp - thisIp));
            }
        }
        else
        {
            if (thisPort >= otherPort)
            {
                return false;
            }
            else
            {
                return ((unsigned)(thisIp - otherIp) < (unsigned)(otherPort - thisPort));
            }
        }

    Сравнить IPv4 адрес + порт. Т.е., по сути, (thisIP + thisPort) < (otherIP + otherPort).
    unsigned long long, приди!

    Запостил: gost, 21 Мая 2016

    Комментарии (23) RSS

    • Это ст
      Ответить
    • А зачем?
      Ответить
    • struct { ip, port } + memcmp
      Ответить
    • this->sockaddr.sin_addr.S_un.S_addr

      Вот блять почему в С/С++ нельзя называть переменные по нормальному?
      Ответить
      • Названия переменных можно локально перегрузить через дефайны
        Ответить
      • Это тяжелое наследие берклевых сокетов.
        Ничето не мешает тебе назвать их SocketAddress
        Ответить
        • Причём, скорее всего, этот код и есть подобная обёртка, раз там this->sockaddr.
          Ответить
          • Да, именно она. Быстровелосипед для быстроутилиты.
            Ответить
    • в коде полная чушь если чо
      порты надо сравнивать только если адреса равны
      Ответить
      • Блин, то-то меня всё время грызло странное ощущение, что код немного неправильный... Спасибо, добрый человек!
        Ответить
    • Если уж по-крестовому, то проще std::make_tuple(ip1, port1) < std::make_tuple(ip2, port2).
      Ответить
      • Мы часто пишем
        std::tie(ip1, port1) < std::tie(ip2, port2)
        Если компилять с O2, то производительность примерно как у написанных вручную сравнений, если без оптимизации - примерно на порядок медленнее.
        Ответить

    Добавить комментарий