Программирование на C++ глазами хакера


Серверные функции - часть 2


  • 1024—49151 — зарезервированы IANA, но могут использоваться процессами и программами. Большинство из этих портов можно использовать;
  • 49152—65535 — частные порты, никем не зарезервированы.
  • Если во время выполнения функции bind выяснится, что порт уже используется какой-либо службой, то функция вернет ошибку WSAEADDRINUSE.

    Давайте рассмотрим пример кода, который создает сокет и привязывает к нему сетевой локальный адрес:

    SOCKET s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(4888); addr.sin_addr.s_addr=htonl(INADDR_ANY);

    bind(s, (SOCKADDR*)&addr), sizeof(addr);

    В данном примере создается сокет со следующими параметрами:

    • AF_INET — означает, что будет использоваться семейство интернет-протоколов;
    • SOCK_STREAM — указывает на протокол, устанавливающий соединение;
    • IPPROTO_TCP — используется протокол TCP.

    Затем объявляется структура addr типа sockaddr_in. В параметре sin_family структуры также указывается семейство интернет-протоколов (AF_INET). В параметре sin_port указывается номер порта. Байты в номере должны следовать в определенном порядке, который несовместим с порядком байт в числовых переменных языка С, поэтому происходит преобразование с помощью функции htons.

    В параметре sin_addr.s_addr указывается специальный адрес inaddr_any, который позволит в дальнейшем программе ожидать соединение на любом сетевом интерфейсе. Это значит, что если у вас две сетевые карты, соединенные с разными сетями, то программа будет ожидать соединения из обеих сетей. Есть еще один адрес, который можно указать, — INADDR_ANY. Позволяет рассылать широковещательные данные для всех компьютеров сети.

    После того как локальный адрес и порт привязаны к сокету, можно приступить к прослушиванию порта в ожидании соединения со стороны клиента. Для этого служит функция listen, которая выглядит следующим образом:

    int listen ( SOCKET s, int backlog );

    Первый параметр — это все тот же сокет, который был создан и к которому привязан адрес. По этим данным функция определит, на каком порту нужно запустить прослушивание.




    Начало  Назад  Вперед



    Книжный магазин