ابزار کاربر

ابزار سایت


c-socket-programming:getaddrinfo

تفاوت‌ها

تفاوت دو نسخهٔ متفاوت از صفحه را مشاهده می‌کنید.

پیوند به صفحه‌ی تفاوت‌ها

نگارش قبل در دو طرفنگارش قبل
نگارش بعد
نگارش قبل
c-socket-programming:getaddrinfo [2024/06/18 22:56] pejmanc-socket-programming:getaddrinfo [2024/06/28 13:31] (فعلی) pejman
خط 3: خط 3:
 معمولا از تابع ()getaddrinfo برای پر کردن استراکچر های مورد نیاز توابع دیگر یا ترجمه آدرس های اینترنتی استفاده میشود. معمولا از تابع ()getaddrinfo برای پر کردن استراکچر های مورد نیاز توابع دیگر یا ترجمه آدرس های اینترنتی استفاده میشود.
  
-  #include <sys/types.h> +<code> 
-  #include <sys/socket.h> +#include <sys/types.h> 
-  #include <netdb.h> +#include <sys/socket.h> 
-   +#include <netdb.h>
-  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);+
  
 +int getaddrinfo(const char *restrict node,
 +                const char *restrict service,
 +                const struct addrinfo *restrict hints,
 +                struct addrinfo **restrict res);
 +
 +void freeaddrinfo(struct addrinfo *res);
 +
 +const char *gai_strerror(int errcode);
 +
 +
 +Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
 +
 +getaddrinfo(), freeaddrinfo(), gai_strerror():
 +    Since glibc 2.22:
 +        _POSIX_C_SOURCE >= 200112L
 +    glibc 2.21 and earlier:
 +        _POSIX_C_SOURCE
 +</code>
 تابع ()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]] قابل استفاده است.
  
خط 46: خط 57:
  
 <code C> <code C>
-// man 7 ip 
 struct sockaddr_in { struct sockaddr_in {
     short int          sin_family;  // Address family, AF_INET     short int          sin_family;  // Address family, AF_INET
خط 54: خط 64:
 }; };
  
-// man 7 ipv6 
 struct sockaddr_in6 { struct sockaddr_in6 {
     u_int16_t       sin6_family;   // address family, AF_INET6     u_int16_t       sin6_family;   // address family, AF_INET6
خط 67: خط 76:
  
 <code C> <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; typedef uint32_t in_addr_t;
 struct in_addr { struct in_addr {
خط 76: خط 81:
 }; };
      
-// man 7 ipv6 
 struct in6_addr { struct in6_addr {
     unsigned char   s6_addr[16];   // IPv6 address     unsigned char   s6_addr[16];   // IPv6 address
 }; };
 </code> </code>
 +
  
 در مثال زیر برای ترجمه نام اینترنتی به IP با کمک DNS ، از تابع ()getaddrinfo استفاده شده است.  hints باید از قبل با memset صفر شده باشد و لااقل فیلد های ai_family و ai_socktype و ai_protocol مقدار دهی شده باشند : در مثال زیر برای ترجمه نام اینترنتی به IP با کمک DNS ، از تابع ()getaddrinfo استفاده شده است.  hints باید از قبل با memset صفر شده باشد و لااقل فیلد های ai_family و ai_socktype و ai_protocol مقدار دهی شده باشند :
خط 86: خط 91:
 <code C> <code C>
 // getaddrinfo.c // getaddrinfo.c
-// gcc -Wall -Wextra -Werror -pedantic -o getaddrinfo getaddrinfo.c+// gcc -std=c99 -Wall -Wextra -Werror -pedantic -o getaddrinfo getaddrinfo.c 
 + 
 +#define _POSIX_C_SOURCE 200112L
  
 #include <stdio.h> #include <stdio.h>
خط 100: خط 107:
     char *node = "www.yahoo.com";     char *node = "www.yahoo.com";
  
-    int errcode; +    struct addrinfo hints, *res;
-    struct addrinfo hints, *res ,*p;+
  
     memset(&hints, 0, sizeof hints);     memset(&hints, 0, sizeof hints);
-    hints.ai_family = AF_UNSPEC; +    hints.ai_family = AF_UNSPEC;        
-    hints.ai_socktype = SOCK_STREAM;+    hints.ai_socktype = SOCK_STREAM;    // defined in /usr/include/bits/socket_type.h
     hints.ai_protocol = 0;     hints.ai_protocol = 0;
  
-    errcode = getaddrinfo(node, NULL, &hints, &res);+    int errcode = getaddrinfo(node, NULL, &hints, &res);
     if (errcode != 0) {     if (errcode != 0) {
         fprintf(stderr, "getaddrinfo() error: %s\n", gai_strerror(errcode));         fprintf(stderr, "getaddrinfo() error: %s\n", gai_strerror(errcode));
خط 116: خط 122:
     printf("\nInternet addresses of %s :\n\n", node);     printf("\nInternet addresses of %s :\n\n", node);
  
-    for (p = res; p != NULL; p = p->ai_next) {+    for (struct addrinfo *p = res; p != NULL; p = p->ai_next) {
         char *ipver, ipstr[INET6_ADDRSTRLEN];         char *ipver, ipstr[INET6_ADDRSTRLEN];
         void *addr;         void *addr;
خط 133: خط 139:
         printf("  %s: %s\n", ipver, ipstr);         printf("  %s: %s\n", ipver, ipstr);
     }     }
-    printf("\n"); 
  
     freeaddrinfo(res);     freeaddrinfo(res);
خط 151: خط 156:
     IPv6: 2a00:1288:110:c305::1:8001     IPv6: 2a00:1288:110:c305::1:8001
  
 +
 +
 +همانطور که در قسمت 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.1718738786.txt.gz · آخرین ویرایش: 2024/06/18 22:56 توسط pejman

به جز مواردی که ذکر می‌شود، مابقی محتویات ویکی تحت مجوز زیر می‌باشند: Public Domain
Public Domain Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki