Укрощение @Интернет@



         

Адрес раз, адрес два…


С адресами как раз и наблюдается наибольшая путаница, в которую не помешает внести немного ясности. Прежде всего структура sockaddr определенная так:

struct sockaddr

{

u_short     sa_family;  // семейство протоколов (как правило AF_INET)

char  sa_data[14];      // IP-адрес узла и порт

};

Однако, теперь уже считается устаревшей, и в Winsock 2.x на смену ей пришла структура sockaddr_in, определенная следующим образом:

struct sockaddr_in

{

short       sin_family;           // семейство протоколов (как правило AF_INET)

u_short  sin_port;                                // порт

struct      in_addr sin_addr;                // IP – адрес

char        sin_zero[8];           // хвост

};

В общем-то ничего не изменилось (и стоило огород городить?), замена безнакового короткого целого на знаковое короткое целое для представления семейства протоколов ничего не дает. Зато теперь адрес узла представлен в виде трех полей – sin_port (номера порта), sin_addr (IP-адреса узла) и "хвоста" из восьми нулевых байт, который остался от четырнадцати символьного массива sa_data. Для чего он нужен? Дело в том, что структура sockaddr не привязана именно к Интернет и может работать и с другими сетями. Адреса же некоторых сетей требуют для своего представления гораздо больше четырех байт, - вот и приходится брать с запасом!

Структура in_addr определяется следующим в образом:

struct in_addr {

union {

struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;          // IP-адрес

struct { u_short s_w1,s_w2; } S_un_w;                          // IP-адрес

u_long S_addr;                                                                    // IP-алрес

} S_un;

}

Как видно, она состоит из одного IP-адреса, записанного в трех "ипостасях" – четырехбайтовой последовательности (S_un_b), пары двухбайтовых слов (S_un_W) и одного длинного целого (S_addr) – выбирай на вкус… Но не все так просто! Во многих программах, технических руководствах и даже демонстрационных примерах, прилагающихся к Winsock SDK, встречается обращение к "таинственному" члену структуры s_addr, который явно не описан в SDK! Например, вот строка из файла "Simples.h": "local.sin_addr.s{<<<выделить 's' жирным}_addr = (!interface)?INADDR_ANY:inet_addr(interface);"




Содержание  Назад  Вперед