socket-programming:getaddrinfo
تفاوتها
تفاوت دو نسخهٔ متفاوت از صفحه را مشاهده میکنید.
| socket-programming:getaddrinfo [2024/06/18 00:26] – ایجاد شد pejman | socket-programming:getaddrinfo [2024/06/18 00:58] (فعلی) – حذف شد pejman | ||
|---|---|---|---|
| خط 1: | خط 1: | ||
| - | ====== تابع ()getaddrinfo ====== | ||
| - | |||
| - | معمولا از تابع ()getaddrinfo برای پر کردن استراکچر های مورد نیاز توابع دیگر یا ترجمه آدرس های اینترنتی استفاده میشود. | ||
| - | |||
| - | #include < | ||
| - | #include < | ||
| - | #include < | ||
| - | | ||
| - | int getaddrinfo(const char *node, const char *service, | ||
| - | const struct addrinfo *hints, | ||
| - | struct addrinfo **res); | ||
| - | | ||
| - | void freeaddrinfo(struct addrinfo *res); | ||
| - | | ||
| - | const char *gai_strerror(int errcode); | ||
| - | |||
| - | تابع ()getaddrinfo یک node به عنوان Internet Host یک service و یک struct addrinfo به نام hints وارد میکند و نتیجه را در یک linked-list از نوع struct addrinfo به نام res باز میگرداند. خروجی این تابع در [[bind]] و [[connect]] قابل استفاده است. | ||
| - | |||
| - | تابع ()freeaddrinfo برای آزاد کردن حافظه اختصاص داده شده به linked-list و از تابع ()gai_strerror برای کنترل error ها استفاده میشود. | ||
| - | |||
| - | |||
| - | استراکچر addrinfo : | ||
| - | <code C> | ||
| - | // man 3 getaddrinfo | ||
| - | struct addrinfo { | ||
| - | int ai_flags; | ||
| - | int ai_family; | ||
| - | int ai_socktype; | ||
| - | int ai_protocol; | ||
| - | size_t | ||
| - | struct sockaddr *ai_addr; | ||
| - | char *ai_canonname; | ||
| - | struct addrinfo *ai_next; | ||
| - | }; | ||
| - | </ | ||
| - | |||
| - | در استراکچر فوق متغییر ai_addr از نوع *struct sockaddr است : | ||
| - | <code C> | ||
| - | struct sockaddr { | ||
| - | unsigned short sa_family; | ||
| - | char sa_data[14]; | ||
| - | }; | ||
| - | </ | ||
| - | |||
| - | استراکچر فوق به تنهایی قابل استفاده نیست و تنها با cast شدن از struct sockaddr_in یا struct sockaddr_in6 استفاده میشود : | ||
| - | |||
| - | |||
| - | <code C> | ||
| - | // man 7 ip | ||
| - | struct sockaddr_in { | ||
| - | short int sin_family; | ||
| - | unsigned short int sin_port; | ||
| - | struct in_addr | ||
| - | unsigned char sin_zero[8]; | ||
| - | }; | ||
| - | |||
| - | // man 7 ipv6 | ||
| - | struct sockaddr_in6 { | ||
| - | u_int16_t | ||
| - | u_int16_t | ||
| - | u_int32_t | ||
| - | struct in6_addr sin6_addr; | ||
| - | u_int32_t | ||
| - | }; | ||
| - | </ | ||
| - | |||
| - | در استراکچر های فوق struct in_addr و struct in6_addr وجود دارند که در [[inet_ntop]] و [[inet_pton]] قابل استفاده هستند: | ||
| - | |||
| - | <code C> | ||
| - | // man 7 ip | ||
| - | // man 3 inet | ||
| - | // (IPv4 only--see struct in6_addr for IPv6) | ||
| - | // Internet address (a structure for historical reasons) | ||
| - | typedef uint32_t in_addr_t; | ||
| - | struct in_addr { | ||
| - | in_addr_t s_addr; // that's a 32-bit int (4 bytes) | ||
| - | }; | ||
| - | | ||
| - | // man 7 ipv6 | ||
| - | struct in6_addr { | ||
| - | unsigned char | ||
| - | }; | ||
| - | </ | ||
| - | |||
| - | در مثال زیر برای ترجمه نام اینترنتی به IP با کمک DNS ، از تابع ()getaddrinfo استفاده شده است. | ||
| - | |||
| - | <code C> | ||
| - | |||
| - | #include < | ||
| - | #include < | ||
| - | #include < | ||
| - | #include < | ||
| - | #include < | ||
| - | #include < | ||
| - | #include < | ||
| - | |||
| - | |||
| - | int main() | ||
| - | { | ||
| - | char *node = " | ||
| - | |||
| - | int errcode; | ||
| - | struct addrinfo hints, *res ,*p; | ||
| - | |||
| - | memset(& | ||
| - | hints.ai_family = AF_UNSPEC; | ||
| - | hints.ai_socktype = SOCK_STREAM; | ||
| - | hints.ai_protocol = 0; | ||
| - | |||
| - | errcode = getaddrinfo(node, | ||
| - | if (errcode != 0) { | ||
| - | fprintf(stderr, | ||
| - | exit(EXIT_FAILURE); | ||
| - | } | ||
| - | |||
| - | printf(" | ||
| - | |||
| - | for (p = res; p != NULL; p = p-> | ||
| - | char *ipver, ipstr[INET6_ADDRSTRLEN]; | ||
| - | void *addr; | ||
| - | if (p-> | ||
| - | ipver = " | ||
| - | struct sockaddr_in *ipv4 = (struct sockaddr_in *)(p-> | ||
| - | addr = & | ||
| - | } else if (p-> | ||
| - | ipver = " | ||
| - | struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)(p-> | ||
| - | addr = & | ||
| - | } else { | ||
| - | printf(" | ||
| - | } | ||
| - | inet_ntop(p-> | ||
| - | printf(" | ||
| - | } | ||
| - | printf(" | ||
| - | |||
| - | freeaddrinfo(res); | ||
| - | |||
| - | return 0; | ||
| - | } | ||
| - | |||
| - | </ | ||
| - | |||
| - | خروجی | ||
| - | |||
| - | |||
| - | Internet addresses of www.yahoo.com : | ||
| - | | ||
| - | IPv4: 87.248.100.216 | ||
| - | IPv4: 87.248.100.215 | ||
| - | IPv6: 2a00: | ||
| - | IPv6: 2a00: | ||
| - | |||
socket-programming/getaddrinfo.1718657777.txt.gz · آخرین ویرایش: 2024/06/18 00:26 توسط pejman
