Объяснение фрагмента кода, используемого в заголовочных файлах для программирования сокетов - PullRequest
1 голос
/ 30 сентября 2010

Кто-нибудь может объяснить мне этот кусок кода?

/* Pad to size of `struct sockaddr'.  */
unsigned char sin_zero[sizeof (struct sockaddr) -
                       __SOCKADDR_COMMON_SIZE -
                       sizeof (in_port_t) -
                       sizeof (struct in_addr)];

здесь sin_zero - это массив символов, но что является оставшейся частью?Это должно быть какое-то целое число.что означает этот знак "-"?Кто-нибудь может мне это объяснить?

Ответы [ 6 ]

3 голосов
/ 30 сентября 2010

Ну, - называется "минус" :-) Серьезно, все, что в квадратных скобках, предназначено для вычисления размера 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).

2 голосов
/ 30 сентября 2010

sin_zero - это элемент конструкции, который используется для заполнения структуры до определенного минимального размера. В этом случае количество отступов рассчитывается, начиная с требуемого размера (sizeof (struct sockaddr)) и вычитая из него пространство, занимаемое другими элементами структуры.

Итак, чтобы ответить на вопрос: знак «-» здесь просто означает «вычитание».

1 голос
/ 03 января 2011

Я тоже столкнулся с этим вопросом, изучая язык Си.Для других новичков (таких как я) было бы интересно узнать, что это кажется важным очищением * sin_zero * в ваших программах (больше по этой теме можно найти ЗДЕСЬ ).

В некоторых системах / архитектурах это может вызвать проблемы, а в других это может быть нормально, если явно не очистить * sin_zero *.

Пример очистки sin_zero:

struct sockaddr_in serversin;
memset(&serversin, 0, sizeof(serversin));
serversin.sin_family = ...;
serversin.sin_addr = ...;
serversin.sin_port = ...;

Чтобы предотвратить будущие ошибки, я думаю, что лучше явным образом очистить его.

0 голосов
/ 30 сентября 2010

Он рассчитывает размер массива на основе размера некоторых структур и константы.Знак «-» означает минус.

0 голосов
/ 30 сентября 2010

sin_zeor - массив символов, размер которого вычисляется по формуле в скобках []. Знак '-' на самом деле является математическим знаком минус: -)

hth

Mario

0 голосов
/ 30 сентября 2010

Sockaddr содержит некоторые вещи, такие как in_addr и in_port_t, и в нем есть место для некоторых других.Sin_zero - это оставшийся размер в sockaddr.Это размер sockaddr, который не заполнен чем-то другим.

Предположительно, переменная sin_zero будет инициализирована всеми нулевыми байтами и установлена ​​как последнее поле или в конце структуры sockaddr.Цель этого состоит в том, чтобы установить оставшиеся байты равными нулю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...