2012-06-13 43 views
0

這是一個我沒有完全理解的語句。瞭解一個C socket指令

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

這是否意味着:

  1. 我把hphp->h_addr
  2. 這一切struct in_addr*類型的h_addr
  3. 類型轉換已經被複制到s_addr

因此serv_addr.sin_addr.s_addr包含選擇主機的主機名和ip地址。
這是正確的嗎?
(PS:惠普是struct hostent *hp ; hp=gethostbyname(argv[1]);

+0

'gethostbyname()'已被棄用,您可以考慮使用'getaddrinfo()'來代替。 – alk

+0

我知道,我讀過這個,但我需要一個簡單的實現,所以我會在(近)未來:)學習getaddrinfo(它更復雜):) – polslinux

回答

3

您需要了解the arrow operator

從本質上講,當你有一個指向該結構的指針時,它允許你訪問結構的成員。

因此,hp->h_addr,您可以訪問到hostent結構hp點的h_addr成員。然後,您將該成員投射到in_addr *並取消引用,以便您可以訪問in_addr結構的s_addr成員。

+0

非常感謝:)我瞭解了我的BIG錯誤: ) – polslinux

2

(1)是錯誤的。 hp->h_addr(*hp).h_addr的簡稱。這是一個解除引用和一個成員選擇。

在英語中,人們可能會說「複製hph_addrserv_addrs_addr。這需要演員。

+0

也謝謝你,你也幫了我很多:) – polslinux