Ну, -
называется "минус" :-) Серьезно, все, что в квадратных скобках, предназначено для вычисления размера sin_zero, который является так называемым заполнением. Это элемент внутри struct sockaddr_in
, и он здесь для того, чтобы убедиться, что struct sockaddr_in
точно определенного размера, скорее всего 16 байтов. Идея состоит в том, чтобы убедиться, что большинство (*) struct sockaddr
вариантов имеют одинаковый размер, чтобы избежать проблем с malloc.
Цитируя документ, который я нашел на эту тему :
Спецификация POSIX требует только трех членов в структуре: sin_family, sin_addr и sin_port. Для реализации, совместимой с POSIX, допустимо определять дополнительные элементы структуры, и это нормально для структуры адреса сокета Интернета. Почти во всех реализациях добавляется член sin_zero, так что все структуры адреса сокета имеют размер не менее 16 байтов.
(*) В более ранней версии я написал all . @MaximYegorushkin правильно заметил, что это не так, например struct sockaddr_un
больше. Если вы хотите максимальный размер, который подходит для всех типов адресов, используйте sizeof(struct sockaddr_storage)
. Эта структура существует только для этой цели (AFAIK).