Это архив сайта coldflame.by.ru, он не обновлялся с 2007 года. Мой современный сайт тут: http://leonid.shevtsov.me.
Домой! Обо мне Специально для РИ-06-1 Разнообразное... барахло, короче :) Программы и прочее Статьи и переводы Блог SmartDaemon
Предыдущая ОглавлениеСледующая

struct sockaddr_in, struct in_addr

Структуры для работы с интернет-адресами

Прототипы

#include <netinet/in.h>

struct sockaddr_in {
    short            sin_family;   // например, AF_INET
    unsigned short   sin_port;     // например, htons(3490)
    struct in_addr   sin_addr;     // см. struct in_addr, ниже
    char             sin_zero[8];  // можешь обнулить это, если хочешь
};

struct in_addr {
    unsigned long s_addr;  // использовать inet_aton()
};

Описание

Эти две структуры используются везде, где надо передать интернет-адрес. В памяти struct sockaddr_in располагается так же, как и struct sockaddr, и можно спокойно кастовать их туда и обратно без всякого вреда, кроме возможного конца света.

Шучу про конец света, конечно... если он наступит, когда ты скастуешь struct sockaddr_in* в struct sockaddr*, можешь быть уверен, что это просто совпадение и не стоит об этом беспокоиться.

Имея это ввиду, помни, что когда функция берет struct sockaddr*, можешь вместо него передать обкастованный struct sockaddr_in*.

Есть еще поле sin_zero, кое-кто говорит, что его нужно обнулять. А еще кое-кто об этом умалчивает (например, документация Linux), и по-видимому обнуление поля совсем необязательно. Впрочем, если тебе хочется, можешь обнулить его с помощью memset().

А вот структура in_addr отличается от системы к системе. Кое-где это union с разными #define'ами и всяким бредом. Но ты вполне можешь использовать только поле s_addr и быть спокойным.

С IPv4, который используется повсеместно в 2005 году, struct s_addr - 4-байтовое число, хранящее IP-адрес.

Пример

struct sockaddr_in myaddr;
int s;

myaddr.sin_family = AF_INET;
myaddr.sin_port = htons(3490);
inet_aton("63.161.169.137", &myaddr.sin_addr.s_addr);

s = socket(PF_INET, SOCK_STREAM, 0);
bind(s, (struct sockaddr*)myaddr, sizeof(myaddr));

См. также

accept(), bind(), connect(), inet_aton(), inet_ntoa()


Предыдущая ОглавлениеСледующая