Кресты / Говнокод #20053 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 gost, (Updated )

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

  • 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, то производительность примерно как у написанных вручную сравнений, если без оптимизации - примерно на порядок медленнее.
      Ответить

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

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8