ابزار کاربر

ابزار سایت


c-socket-programming:getaddrinfo

تفاوت‌ها

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

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

نگارش قبل در دو طرفنگارش قبل
نگارش بعد
نگارش قبل
c-socket-programming:getaddrinfo [2024/06/19 08:55] pejmanc-socket-programming:getaddrinfo [2024/06/28 13:31] (فعلی) pejman
خط 85: خط 85:
 }; };
 </code> </code>
 +
  
 در مثال زیر برای ترجمه نام اینترنتی به IP با کمک DNS ، از تابع ()getaddrinfo استفاده شده است.  hints باید از قبل با memset صفر شده باشد و لااقل فیلد های ai_family و ai_socktype و ai_protocol مقدار دهی شده باشند : در مثال زیر برای ترجمه نام اینترنتی به IP با کمک DNS ، از تابع ()getaddrinfo استفاده شده است.  hints باید از قبل با memset صفر شده باشد و لااقل فیلد های ai_family و ai_socktype و ai_protocol مقدار دهی شده باشند :
خط 90: خط 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>
خط 104: خط 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));
خط 120: خط 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;
خط 137: خط 139:
         printf("  %s: %s\n", ipver, ipstr);         printf("  %s: %s\n", ipver, ipstr);
     }     }
-    printf("\n"); 
  
     freeaddrinfo(res);     freeaddrinfo(res);
خط 155: خط 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.1718774742.txt.gz · آخرین ویرایش: 2024/06/19 08:55 توسط pejman

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