sockaddr_in для OS X
От: dosik Россия www.dosik.ru
Дата: 19.07.16 16:57
Оценка:
Обратил внимание, что в реализации для mac структура sockaddr_in выглядит следующим образом:
struct sockaddr_in {
    __uint8_t    sin_len;
    sa_family_t    sin_family;
    in_port_t    sin_port;
    struct    in_addr sin_addr;
    char        sin_zero[8];
};

Т.е. в отличии от виндово/линуксовой реализации, тут еще присутствует поле sin_len. Что енто, для чего оно и на сколько критичное его заполнение?
Re: sockaddr_in для OS X
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 19.07.16 17:34
Оценка: +1
Здравствуйте, dosik, Вы писали:

D>Т.е. в отличии от виндово/линуксовой реализации, тут еще присутствует поле sin_len. Что енто, для чего оно и на сколько критичное его заполнение?


Это во всех BSD.

Если 0, то принимается по умолчанию согласно значению sin_family.
Ставится не в 0 для структур переменного размера (таких, как sockaddr_un).

Перед любым использованием любую из структур sockaddr* надо через bzero/memset заливать нулевыми байтами, в некоторых случаях не только sin_len, но и sin_zero даёт интересные последствия.
The God is real, unless declared integer.
Re[2]: sockaddr_in для OS X
От: dosik Россия www.dosik.ru
Дата: 19.07.16 17:36
Оценка:
Здравствуйте, netch80, Вы писали:

N>Перед любым использованием любую из структур sockaddr* надо через bzero/memset заливать нулевыми байтами, в некоторых случаях не только sin_len, но и sin_zero даёт интересные последствия.


А вот про енто слышал, но не придавал значения. Спасибо что напомнили.
Re[2]: sockaddr_in для OS X
От: Mr.Delphist  
Дата: 29.07.16 11:19
Оценка:
Здравствуйте, netch80, Вы писали:

N>Здравствуйте, dosik, Вы писали:


D>>Т.е. в отличии от виндово/линуксовой реализации, тут еще присутствует поле sin_len. Что енто, для чего оно и на сколько критичное его заполнение?


N>Это во всех BSD.


N>Если 0, то принимается по умолчанию согласно значению sin_family.

N>Ставится не в 0 для структур переменного размера (таких, как sockaddr_un).

N>Перед любым использованием любую из структур sockaddr* надо через bzero/memset заливать нулевыми байтами, в некоторых случаях не только sin_len, но и sin_zero даёт интересные последствия.


Старые версии Windows заливали sin_zero нулями самостоятельно, что иногда приводило к интересным последствиям, если память read-only http://windowsasusual.blogspot.ru/2013/05/detective-story-sendto-and-10014.html
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.