С вопросом о кастинге - PullRequest
       5

С вопросом о кастинге

0 голосов
/ 09 апреля 2010

Может кто-нибудь объяснить мне это утверждение!

pin.sin_addr.s_addr = ((struct in_addr *)(hp->h_addr))->s_addr;

Ответы [ 8 ]

8 голосов
/ 09 апреля 2010

Берет hp->h_addr и приводит к struct in_addr*. Актерский состав может иметь разные причины. Возможно, hp->h_addr равно void*, и приведение необходимо, чтобы сообщить компилятору, какой тип он должен использовать для поиска s_addr. Это также может быть другая структура, которая имеет in_addr в качестве первого члена

struct in_addr {
  struct saddr_t s_addr;
};

struct socket {
  struct in_addr addr;
};

struct server {
  struct socket *h_addr;
};

server *hp;

Тогда приведение socket* к in_addr* будет допустимым, потому что в его адресе есть in_addr в начале. После приведения к члену s_addr осуществляется доступ. Эти типы распространены в сетевом программировании под POSIX и не похожи на мой приведенный выше пример, но вышеупомянутая ситуация могла быть под рукой.

7 голосов
/ 09 апреля 2010

Он преобразует член структуры h_addr в структуру struct in_addr *, а затем ссылается на член s_addr вновь приведенного элемента in_addr

4 голосов
/ 09 апреля 2010

hp-> a_addr приводится к указателю на структуру типа in_addr, в in_addr указаны поля, такие как s_addr и т. Д.

Сокеты Unix могут обрабатывать различные типы сетевой адресации, интернет-адресация является лишь одним из них, поэтому при обращении к различным полям необходимо приводить дескриптор адреса сокета к правильному.

Например, sockaddr_in6 обрабатывает адреса IPv6, которые отличаются от sockaddr_in.

1 голос
/ 10 апреля 2010

hp - это указатель типа struct hostent , который, скорее всего, будет возвращен вызовом " gethostbyname () ". У него есть член с именем h_addr, который на самом деле является псевдонимом для h_addr_list [0] (он содержит первый IP-адрес, полученный для вашего запроса имени). В этом случае; Вы передаете этот IP-адрес в переменную типа struct sockaddr_in типа "pin". Он имеет член с именем sin_addr с типом struct in_addr .

struct in_addr { unsigned long int s_addr; }

Чтобы завершить присваивание, вам нужно набрать h_addr для структурирования ptr in_addr (обычно это char *), затем получить доступ к члену s_addr.

Надеюсь, это объясняет, что происходит с тобой.

1 голос
/ 09 апреля 2010

Это обрабатывает hp->h_addr, как если бы оно указывало на struct in_addr, а затем пытается получить доступ к s_addr члену этого struct in_addr

0 голосов
/ 09 апреля 2010

(hp-> h_addr): получить поле h_addr из указателя hp

((struct in_addr *) (hp-> h_addr)): привести приведенный выше оператор инструкции к указателю на структуру in_addr

-> s_addr: получить поле s_addr из результирующего указателя вышеприведенного оператора

=: назначение.

0 голосов
/ 09 апреля 2010

Изнутри ot:

  • hp->h_haddr получает элемент h_addr структуры, на который указывает hp.
  • (struct in_addr *) преобразует это значение h_addr в указатель на структуру in_addr.
  • ->s_addr получает элемент s_addr структуры in_addrна что он указал.

Следовательно, он получает элемент s_addr структуры, на который указывает элемент h_addr структуры, на которую указывает hp.(hp и h_addr оба указатели)

Затем это значение присваивается pin.sin_addr.s_addr.

0 голосов
/ 09 апреля 2010

установить поле s_addr поля sin_addr структуры, содержащей переменный вывод со значением, помещенным в поле s_addr, которое расположено по адресу, указанному полем h_addr структуры, содержащейся в переменной hp

другими словами, взять адрес из значения h_addr hp и предположить, что он указывает на (in_addr), и скопировать поле s_addr, чтобы оценить поле pin.sin_addr

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