socket-programming:inet_pton
تفاوتها
تفاوت دو نسخهٔ متفاوت از صفحه را مشاهده میکنید.
| socket-programming:inet_pton [2024/06/18 00:25] – ایجاد شد pejman | socket-programming:inet_pton [2024/06/18 00:57] (فعلی) – حذف شد pejman | ||
|---|---|---|---|
| خط 1: | خط 1: | ||
| - | ====== تابع ()inet_pton ====== | ||
| - | |||
| - | برای استفاده از آدرس IP در اکثر توابع، باید ابتدا IP از شکل رشته ای (شکل نمایشی یا presentation) به شکل Network-Byte-Order تبدیل شود. این تبدیل توسط ()inet_pton انجام می شود. | ||
| - | |||
| - | #include < | ||
| - | | ||
| - | int inet_pton(int af, const char *src, void *dst); | ||
| - | |||
| - | |||
| - | تعریف struct in_addr به شکل زیر است | ||
| - | <code C> | ||
| - | // man 7 ip | ||
| - | // man 3 inet | ||
| - | // 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) | ||
| - | }; | ||
| - | </ | ||
| - | |||
| - | نمونه تبدیل در IPv4 : | ||
| - | |||
| - | <code C> | ||
| - | #include < | ||
| - | #include < | ||
| - | |||
| - | int main() | ||
| - | { | ||
| - | char *ipv4 = " | ||
| - | struct in_addr ia; | ||
| - | |||
| - | inet_pton(AF_INET, | ||
| - | |||
| - | printf(" | ||
| - | printf(" | ||
| - | printf(" | ||
| - | printf(" | ||
| - | printf(" | ||
| - | printf(" | ||
| - | |||
| - | return 0; | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | خروجی : | ||
| - | ipv4 string : 192.168.154.239 | ||
| - | sizeof(struct in_addr) : 4 | ||
| - | ia hex : EF9AA8C0 | ||
| - | ia hex : EF9AA8C0 | ||
| - | ia dec : 4019890368 | ||
| - | ia dec : 4019890368 | ||
| - | |||
| - | |||
| - | همانطور که در مثال فوق مشاهده می شود چون struct in_addr فقط یک عضو دارد(s_addr) پس می توان از ia و ia.s_addr به شکل یکسان استفاده کرد. | ||
| - | |||
| - | تفاوت Network-Byte-Order و Host-Byte-Order در خروجی فوق به خوبی دیده میشود چون 192 معادل 0xC0 و 168 معادل 0xA8 و 154 معادل معادل | ||
| - | |||
| - | در تعریف struct in_addr می بینیم که s_addr از نوع uint32_t تعریف شده پس بجای struct in_addr می توان از unsigned int استفاده کرد که روش مناسبی نیست. ولی برای درک بهتر این روش را آزمایش میکنیم : | ||
| - | |||
| - | <code C> | ||
| - | #include < | ||
| - | #include < | ||
| - | |||
| - | int main() | ||
| - | { | ||
| - | char *ipv4 = " | ||
| - | unsigned int ui; | ||
| - | |||
| - | inet_pton(AF_INET, | ||
| - | |||
| - | printf(" | ||
| - | printf(" | ||
| - | printf(" | ||
| - | printf(" | ||
| - | |||
| - | return 0; | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | خروجی | ||
| - | |||
| - | ipv4 string : 192.168.154.239 | ||
| - | sizeof(unsigned int) : 4 | ||
| - | ia hex : EF9AA8C0 | ||
| - | ia dec : 4019890368 | ||
| - | | ||
| - | همانطور که در مثال فوق مشاهده میشود، می توان از unsigned int به راحتی به جای | ||
| - | |||
| - | به دلیل تعریف dst از نوع *void است که می توانیم برخورد چند گانه با آن داشته باشیم (Poor Man's Polymorphism) | ||
| - | |||
| - | نمونه تبدیل در IPv6 : | ||
| - | |||
| - | <code C> | ||
| - | #include < | ||
| - | #include < | ||
| - | |||
| - | int main() | ||
| - | { | ||
| - | char *ipv6 = " | ||
| - | struct in6_addr i6a; | ||
| - | |||
| - | inet_pton(AF_INET6, | ||
| - | |||
| - | printf(" | ||
| - | printf(" | ||
| - | for(int i=0; i < sizeof(struct in6_addr); i++) | ||
| - | printf(" | ||
| - | printf(" | ||
| - | |||
| - | return 0; | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | خروجی : | ||
| - | |||
| - | sizeof(struct in6_addr) : 16 | ||
| - | ipv6 str: 0011: | ||
| - | 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF | ||
| - | |||
| - | در مثال فوق مشاهده می شود که در IPv6 روش | ||
| - | |||
socket-programming/inet_pton.1718657737.txt.gz · آخرین ویرایش: 2024/06/18 00:25 توسط pejman
