c-socket-programming:getaddrinfo
تفاوتها
تفاوت دو نسخهٔ متفاوت از صفحه را مشاهده میکنید.
| نگارش قبل در دو طرفنگارش قبلنگارش بعد | نگارش قبل | ||
| c-socket-programming:getaddrinfo [2024/06/19 08:54] – pejman | c-socket-programming:getaddrinfo [2024/06/28 13:31] (فعلی) – pejman | ||
|---|---|---|---|
| خط 4: | خط 4: | ||
| < | < | ||
| - | #include < | + | #include < |
| - | | + | #include < |
| - | | + | #include < |
| + | |||
| + | int getaddrinfo(const char *restrict node, | ||
| + | const char *restrict service, | ||
| + | const struct addrinfo *restrict hints, | ||
| + | struct addrinfo **restrict res); | ||
| - | int getaddrinfo(const char *restrict node, | + | void freeaddrinfo(struct addrinfo *res); |
| - | const char *restrict service, | + | |
| - | | + | |
| - | | + | |
| - | void freeaddrinfo(struct addrinfo | + | const char *gai_strerror(int errcode); |
| - | const char *gai_strerror(int errcode); | ||
| - | Feature Test Macro Requirements for glibc (see feature_test_macros(7)): | + | Feature Test Macro Requirements for glibc (see feature_test_macros(7)): |
| - | getaddrinfo(), | + | getaddrinfo(), |
| - | | + | Since glibc 2.22: |
| - | | + | _POSIX_C_SOURCE >= 200112L |
| - | | + | glibc 2.21 and earlier: |
| - | | + | _POSIX_C_SOURCE |
| </ | </ | ||
| تابع ()getaddrinfo یک node به عنوان Internet Host یک service و یک struct addrinfo به نام hints وارد میکند و نتیجه را در یک linked-list از نوع struct addrinfo به نام res باز میگرداند. خروجی این تابع در [[bind]] و [[connect]] قابل استفاده است. | تابع ()getaddrinfo یک node به عنوان Internet Host یک service و یک struct addrinfo به نام hints وارد میکند و نتیجه را در یک linked-list از نوع struct addrinfo به نام res باز میگرداند. خروجی این تابع در [[bind]] و [[connect]] قابل استفاده است. | ||
| خط 84: | خط 85: | ||
| }; | }; | ||
| </ | </ | ||
| + | |||
| در مثال زیر برای ترجمه نام اینترنتی به IP با کمک DNS ، از تابع ()getaddrinfo استفاده شده است. | در مثال زیر برای ترجمه نام اینترنتی به IP با کمک DNS ، از تابع ()getaddrinfo استفاده شده است. | ||
| خط 89: | خط 91: | ||
| <code C> | <code C> | ||
| // getaddrinfo.c | // getaddrinfo.c | ||
| - | // gcc -Wall -Wextra -Werror -pedantic -o getaddrinfo getaddrinfo.c | + | // gcc -std=c99 |
| + | |||
| + | #define _POSIX_C_SOURCE 200112L | ||
| #include < | #include < | ||
| خط 103: | خط 107: | ||
| char *node = " | char *node = " | ||
| - | | + | struct addrinfo hints, *res; |
| - | | + | |
| memset(& | memset(& | ||
| - | hints.ai_family = AF_UNSPEC; | + | hints.ai_family = AF_UNSPEC; |
| - | hints.ai_socktype = SOCK_STREAM; | + | hints.ai_socktype = SOCK_STREAM; |
| hints.ai_protocol = 0; | hints.ai_protocol = 0; | ||
| - | errcode = getaddrinfo(node, | + | |
| if (errcode != 0) { | if (errcode != 0) { | ||
| fprintf(stderr, | fprintf(stderr, | ||
| خط 119: | خط 122: | ||
| printf(" | printf(" | ||
| - | for (p = res; p != NULL; p = p-> | + | for (struct addrinfo *p = res; p != NULL; p = p-> |
| char *ipver, ipstr[INET6_ADDRSTRLEN]; | char *ipver, ipstr[INET6_ADDRSTRLEN]; | ||
| void *addr; | void *addr; | ||
| خط 136: | خط 139: | ||
| printf(" | printf(" | ||
| } | } | ||
| - | printf(" | ||
| freeaddrinfo(res); | freeaddrinfo(res); | ||
| خط 154: | خط 156: | ||
| IPv6: 2a00: | IPv6: 2a00: | ||
| + | |||
| + | |||
| + | همانطور که در قسمت Feature Test Macro در manual نوشته شده برای اینکه تعریف توابع ()getaddrinfo و ()freeaddrinfo و ()gai_strerror و استراکچر های مورد نیاز، از طریق header در دسترس باشند (expose شوند) در gcc های ورژن بالاتر از 2.22 باید ماکرو زیر تعریف شود | ||
| + | |||
| + | #define _POSIX_C_SOURCE 200112L | ||
| + | |||
| + | برای بررسی کار کرد ماکرو فوق، می توان یک بار بدون ماکرو و یک بار با وجود ماکرو، از دستور زیر استفاده کنیم و در خروجی، تعریف struct addrinfo را جستجو کنیم. خواهیم دید که بدون ماکرو فوق این استراکچر تعریف نمیشود | ||
| + | |||
| + | gcc -std=c99 -E getaddrinfo.c | ||
c-socket-programming/getaddrinfo.1718774666.txt.gz · آخرین ویرایش: 2024/06/19 08:54 توسط pejman
