Что за приведение типа в аргументе bind?
struct sockaddr_in stSockAddr;
...
bind(SocketFD,(const struct sockaddr *)&stSockAddr, sizeof(struct sockaddr_in));
Зачем нужно приводить stSockAddr к (const struct sockaddr *) ?
struct sockaddr_in stSockAddr;
...
bind(SocketFD,(const struct sockaddr *)&stSockAddr, sizeof(struct sockaddr_in));
Зачем нужно приводить stSockAddr к (const struct sockaddr *) ?
Сокеты устроены хитро, но красиво. Есть одна базовая структура и несколько "наследников". Их разница - начинаются они одинаково, а вот концовки - различные. Тут все, как с классами, только вручную. Посмотрим на определение этих двух структур:
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
является такой базовой функцией.
Так как с++ является типизированным языком, а на структуры "наследованные вручную", то нужно приводить "к базовой структуре".