Что за приведение типа в аргументе bind?

Рейтинг: 0Ответов: 1Опубликовано: 25.10.2014
struct sockaddr_in stSockAddr;
...
bind(SocketFD,(const struct sockaddr *)&stSockAddr, sizeof(struct sockaddr_in));

Зачем нужно приводить stSockAddr к (const struct sockaddr *) ?

Ответы

▲ 4Принят

Сокеты устроены хитро, но красиво. Есть одна базовая структура и несколько "наследников". Их разница - начинаются они одинаково, а вот концовки - различные. Тут все, как с классами, только вручную. Посмотрим на определение этих двух структур:

struct sockaddr {
        ushort  sa_family;
        char    sa_data[14];
};

struct sockaddr_in {
        short   sin_family;
        u_short sin_port;
        struct  in_addr sin_addr;
        char    sin_zero[8];
};

(Честно скопированы с сайта майкрософта, хотя могли быть скопированы и в других местах.)

То есть если это было бы на классах, то первый был базовым, а второй - наследником с двумя дополнительными полями.

Теперь ближе к цели. Некоторые функции работы с сокетами - базовые, они работают с просто сокетами. А есть прицельные - например, работающие с tcp/udp сокетами (есть и другие типы сокетов - например, файловые дескрипторы, пайпы и другое). Базовые функции работают с базовой структурой, прицельные - со своей структурой. Так как начало структуры совпадает, то базовым функциям "побоку" на концовку, главное знать размер (на случай, если нужно скопировать, передать куда-то дальше).

bind является такой базовой функцией.

Так как с++ является типизированным языком, а на структуры "наследованные вручную", то нужно приводить "к базовой структуре".