.\" -*- coding: UTF-8 -*- '\" t .\" Copyright 2007-2008, Michael Kerrisk .\" Copyright 2006, Ulrich Drepper .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\" FIXME . glibc's 2.9 NEWS file documents DCCP and UDP-lite support .\" and is SCTP support now also there? .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH getaddrinfo 3 "8 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم getaddrinfo, freeaddrinfo, gai_strerror \- ترجمة عنوان الشبكة والخدمة .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#include \fP \fB#include \fP \fB#include \fP .P \fBint getaddrinfo(const char *restrict \fP\fInode\fP\fB,\fP \fB const char *restrict \fP\fIservice\fP\fB,\fP \fB const struct addrinfo *restrict \fP\fIhints\fP\fB,\fP \fB struct addrinfo **restrict \fP\fIres\fP\fB);\fP .P \fBvoid freeaddrinfo(struct addrinfo *\fP\fIres\fP\fB);\fP .P \fBconst char *gai_strerror(int \fP\fIerrcode\fP\fB);\fP .fi .P .RS -4 متطلبات ماكروات اختبار الميزات لـ glibc (انظر \fBfeature_test_macros\fP(7)): .RE .P \fBgetaddrinfo\fP(), \fBfreeaddrinfo\fP(), \fBgai_strerror\fP(): .nf منذ glibc 2.22: _POSIX_C_SOURCE >= 200112L glibc 2.21 وما قبله: _POSIX_C_SOURCE .fi .SH الوصف .\" .BR getipnodebyname (3), .\" .BR getipnodebyaddr (3), بمعطى \fInode\fP و \fIservice\fP، اللذان يُعرِّفان مضيف إنترنت وخدمة، تُرجع \fBgetaddrinfo\fP() بنية \fIaddrinfo\fP واحدة أو أكثر، كل منها يحتوي على عنوان إنترنت يمكن تحديده في استدعاء لـ \fBbind\fP(2) أو \fBconnect\fP(2). تدمج دالة \fBgetaddrinfo\fP() الوظائف التي توفرها دالتا \fBgethostbyname\fP(3) و \fBgetservbyname\fP(3) في واجهة واحدة، ولكن على عكس الدالتين الأخيرتين، فإن \fBgetaddrinfo\fP() قابلة لإعادة الدخول وتسمح للبرامج بإزالة التبعيات بين IPv4 و IPv6. .P تحتوي بنية \fIaddrinfo\fP المستخدمة بواسطة \fBgetaddrinfo\fP() على الحقول التالية: .P .in +4n .EX struct addrinfo { int ai_flags; int ai_family; int ai_socktype; int ai_protocol; socklen_t ai_addrlen; struct sockaddr *ai_addr; char *ai_canonname; struct addrinfo *ai_next; }; .EE .in .P يشير معامل \fIhints\fP إلى بنية \fIaddrinfo\fP تحدد معايير اختيار بنى عنوان المقبس المُعادة في القائمة المشار إليها بواسطة \fIres\fP. إذا لم يكن \fIhints\fP NULL، فإنه يشير إلى بنية \fIaddrinfo\fP تحدد حقولها \fIai_family\fP و \fIai_socktype\fP و \fIai_protocol\fP معايير تحد من مجموعة عناوين المقبس التي تُرجعها \fBgetaddrinfo\fP()، كما يلي: .TP \fIai_family\fP يحدد هذا الحقل عائلة العنوان المطلوبة للعناوين المُعادة. تتضمن القيم الصالحة لهذا الحقل \fBAF_INET\fP و \fBAF_UNSPEC\fP. تشير القيمة \fBAF_UNSPEC\fP إلى أن \fBgetaddrinfo\fP() يجب أن تُعيد عناوين مقبس لأي عائلة عنوان (مثل IPv4 أو IPv6) يمكن استخدامها مع \fInode\fP و \fIservice\fP. .TP \fIai_socktype\fP يحدد هذا الحقل نوع المقبس المفضل، على سبيل المثال \fBSOCK_STREAM\fP أو \fBSOCK_DGRAM\fP. يشير تحديد 0 في هذا الحقل إلى أن عناوين مقبس من أي نوع يمكن أن تُعاد بواسطة \fBgetaddrinfo\fP(). .TP \fIai_protocol\fP يحدد هذا الحقل البروتوكول لعناوين المقبس المُعادة. يشير تحديد 0 في هذا الحقل إلى أن عناوين مقبس مع أي بروتوكول يمكن أن تُعاد بواسطة \fBgetaddrinfo\fP(). .TP \fIai_flags\fP يحدد هذا الحقل خيارات إضافية، موصوفة أدناه. تُحدد أعلام متعددة بإجراء عملية OR منطقية عليها معًا. .P يجب أن تحتوي جميع الحقول الأخرى في البنية المشار إليها بواسطة \fIhints\fP إما على 0 أو مؤشر فارغ، حسب الاقتضاء. .P تحديد \fIhints\fP كـ NULL يعادل ضبط \fIai_socktype\fP و \fIai_protocol\fP على 0؛ و \fIai_family\fP على \fBAF_UNSPEC\fP؛ و \fIai_flags\fP على \fB(AI_V4MAPPED\ |\ AI_ADDRCONFIG)\fP. (يحدد POSIX قيمًا مبدئية مختلفة لـ \fIai_flags\fP؛ انظر الملاحظات.) يحدد \fInode\fP إما عنوان شبكة رقمي (لـ IPv4، ترميز الأرقام والنقاط كما تدعمه \fBinet_aton\fP(3)؛ لـ IPv6، تنسيق سلسلة محارف سداسي عشري كما تدعمه \fBinet_pton\fP(3))، أو اسم مضيف شبكة، تُبحث عناوين شبكته وتُحل. إذا احتوى \fIhints.ai_flags\fP على العلم \fBAI_NUMERICHOST\fP، فيجب أن يكون \fInode\fP عنوان شبكة رقمي. يمنع العلم \fBAI_NUMERICHOST\fP أي عمليات بحث عن عنوان مضيف شبكة قد تكون طويلة. .P إذا حُدد العلم \fBAI_PASSIVE\fP في \fIhints.ai_flags\fP، وكان \fInode\fP NULL، فإن عناوين المقبس المُعادة ستكون مناسبة لـ \fBbind\fP(2) مقبس سيقبل \fBaccept\fP(2) اتصالات. سيحتوي عنوان المقبس المُعاد على "عنوان البدل" (\fBINADDR_ANY\fP لعناوين IPv4، \fBIN6ADDR_ANY_INIT\fP لعنوان IPv6). يُستخدم عنوان البدل بواسطة التطبيقات (عادة الخوادم) التي تنوي قبول اتصالات على أي من عناوين شبكة المضيف. إذا لم يكن \fInode\fP NULL، فإن العلم \fBAI_PASSIVE\fP يُتجاهل. .P إذا لم يُضبط العلم \fBAI_PASSIVE\fP في \fIhints.ai_flags\fP، فإن عناوين المقابس المُعادة ستكون مناسبة للاستخدام مع \fBconnect\fP(2) أو \fBsendto\fP(2) أو \fBsendmsg\fP(2). إذا كان \fInode\fP NULL، فسيُضبط عنوان الشبكة على عنوان واجهة الاسترجاع (\fBINADDR_LOOPBACK\fP لعناوين IPv4، \fBIN6ADDR_LOOPBACK_INIT\fP لعناوين IPv6)؛ يُستخدم هذا من قبل التطبيقات التي تنوي التواصل مع الأقران العاملين على نفس المضيف. .P يُضبط \fIservice\fP المنفذ في كل بنية عنوان مُعادة. إذا كانت هذه الوسيطة اسم خدمة (انظر \fBservices\fP(5))، فتُترجم إلى رقم المنفذ المقابل. يمكن أيضًا تحديد هذه الوسيطة كرقم عشري، يُحوّل ببساطة إلى ثنائي. إذا كان \fIservice\fP NULL، فسيُترك رقم منفذ عناوين المقابس المُعادة غير مهيأ. إذا حُدد \fBAI_NUMERICSERV\fP في \fIhints.ai_flags\fP وكان \fIservice\fP ليس NULL، فيجب أن يشير \fIservice\fP إلى سلسلة محارف تحتوي على رقم منفذ عددي. يُستخدم هذا العلم لمنع استدعاء خدمة تحليل الأسماء في الحالات التي يُعرف فيها أنها غير مطلوبة. .P قد يكون إما \fInode\fP أو \fIservice\fP، وليس كلاهما، NULL. .P تخصص الدالة \fBgetaddrinfo\fP() وتهيئ قائمة مرتبطة من بنى \fIaddrinfo\fP، واحدة لكل عنوان شبكة يطابق \fInode\fP و \fIservice\fP، مع مراعاة أي قيود يفرضها \fIhints\fP، وتُعيد مؤشرًا إلى بداية القائمة في \fIres\fP. تُربط العناصر في القائمة المرتبطة بواسطة الحقل \fIai_next\fP. .P هناك عدة أسباب قد تجعل القائمة المرتبطة تحتوي على أكثر من بنية \fIaddrinfo\fP، منها: المضيف الشبكي متعدد الواجهات، يمكن الوصول إليه عبر بروتوكولات متعددة (مثل \fBAF_INET\fP و \fBAF_INET6\fP)؛ أو أن نفس الخدمة متاحة من أنواع مقابس متعددة (عنوان \fBSOCK_STREAM\fP وآخر \fBSOCK_DGRAM\fP مثلاً). عادةً، يجب على التطبيق محاولة استخدام العناوين بالترتيب الذي أُعيدت به. دالة الفرز المستخدمة داخل \fBgetaddrinfo\fP() مُعرّفة في RFC\ 3484؛ يمكن تعديل الترتيب لنظام معين بتحرير \fI/etc/gai.conf\fP (متاح منذ glibc 2.5). .P .\" Prior to glibc 2.3.4, the ai_canonname of each addrinfo .\" structure was set pointing to the canonical name; that was .\" more than POSIX.1-2001 specified, or other implementations provided. .\" MTK, Aug 05 إذا تضمن \fIhints.ai_flags\fP العلم \fBAI_CANONNAME\fP، فسيُضبط الحقل \fIai_canonname\fP لأول بنية \fIaddrinfo\fP في القائمة المُعادة ليشير إلى الاسم الرسمي للمضيف. .P تُهيأ الحقول المتبقية لكل بنية \fIaddrinfo\fP مُعادة كما يلي: .IP \[bu] 3 تُعيد الحقول \fIai_family\fP و \fIai_socktype\fP و \fIai_protocol\fP معاملات إنشاء المقبس (أي أن هذه الحقول لها نفس معنى الوسائط المقابلة لـ \fBsocket\fP(2)). على سبيل المثال، قد يُعيد \fIai_family\fP \fBAF_INET\fP أو \fBAF_INET6\fP؛ قد يُعيد \fIai_socktype\fP \fBSOCK_DGRAM\fP أو \fBSOCK_STREAM\fP؛ ويُعيد \fIai_protocol\fP البروتوكول للمقبس. .IP \[bu] يُوضع مؤشر إلى عنوان المقبس في الحقل \fIai_addr\fP، ويُوضع حجم عنوان المقبس، بالبايت، في الحقل \fIai_addrlen\fP. .P إذا تضمن \fIhints.ai_flags\fP العلم \fBAI_ADDRCONFIG\fP، فتُعاد عناوين IPv4 في القائمة المشار إليها بـ \fIres\fP فقط إذا كان النظام المحلي يحتوي على عنوان IPv4 واحد على الأقل مُهيأ، وتُعاد عناوين IPv6 فقط إذا كان النظام المحلي يحتوي على عنوان IPv6 واحد على الأقل مُهيأ. لا يُعتبر عنوان الاسترجاع صالحًا كعنوان مُهيأ في هذه الحالة. هذا العلم مفيد، على سبيل المثال، في الأنظمة التي تعمل بـ IPv4 فقط، لضمان أن \fBgetaddrinfo\fP() لا تُعيد عناوين مقابس IPv6 التي ستفشل دائمًا في \fBconnect\fP(2) أو \fBbind\fP(2). .P إذا حدد \fIhints.ai_flags\fP العلم \fBAI_V4MAPPED\fP، وحُدد \fIhints.ai_family\fP كـ \fBAF_INET6\fP، ولم يُعثر على عناوين IPv6 مطابقة، فتُعاد عناوين IPv6 المعينة من IPv4 في القائمة المشار إليها بـ \fIres\fP. إذا حُدد كل من \fBAI_V4MAPPED\fP و \fBAI_ALL\fP في \fIhints.ai_flags\fP، فتُعاد عناوين IPv6 وعناوين IPv6 المعينة من IPv4 في القائمة المشار إليها بـ \fIres\fP. يُتجاهل \fBAI_ALL\fP إذا لم يُحدد \fBAI_V4MAPPED\fP أيضًا. .P تحرر الدالة \fBfreeaddrinfo\fP() الذاكرة التي خُصصت للقائمة المرتبطة المخصصة ديناميكيًا \fIres\fP. .SS "إضافات إلى getaddrinfo() لأسماء النطاقات المعولمة" بدءًا من glibc 2.3.4، وُسعت \fBgetaddrinfo\fP() للسماح بشكل انتقائي بتحويل أسماء المضيفات الواردة والصادرة بشفافية من وإلى تنسيق اسم النطاق المعولم (IDN) (انظر RFC 3490، \fIتعميم أسماء النطاقات في التطبيقات (IDNA)\fP). عُرفت أربعة أعلام جديدة: .TP \fBAI_IDN\fP إذا حُدد هذا العلم، فسيُحوّل اسم العقدة المُعطى في \fInode\fP إلى تنسيق IDN إذا لزم الأمر. الترميز المصدر هو ترميز الإعدادات المحلية الحالية. .IP .\" Implementation Detail: .\" To minimize effects on system performance the implementation might .\" want to check whether the input string contains any non-ASCII .\" characters. If there are none the IDN step can be skipped completely. .\" On systems which allow not-ASCII safe encodings for a locale this .\" might be a problem. إذا احتوى اسم الإدخال على محارف غير ASCII، فسيُستخدم ترميز IDN. تُرمّز أجزاء اسم العقدة (المحددة بالنقاط) التي تحتوي على محارف غير ASCII باستخدام الترميز المتوافق مع ASCII (ACE) قبل تمريرها إلى دوال تحليل الأسماء. .TP \fBAI_CANONIDN\fP بعد بحث ناجح عن الاسم، وإذا حُدد العلم \fBAI_CANONNAME\fP، فستُعيد \fBgetaddrinfo\fP() الاسم القانوني للعقدة المقابلة لقيمة بنية \fIaddrinfo\fP المُعادة. القيمة المُعادة هي نسخة طبق الأصل من القيمة التي أُعيدت بواسطة دالة تحليل الأسماء. .IP .\" .\"Implementation Detail: .\"If no component of the returned name starts with xn\-\- the IDN .\"step can be skipped, therefore avoiding unnecessary slowdowns. إذا كان الاسم مُرمّزًا باستخدام ACE، فسيحتوي على البادئة \fIxn\-\-\fP لمكون أو أكثر من مكونات الاسم. لتحويل هذه المكونات إلى شكل قابل للقراءة، يمكن تمرير العلم \fBAI_CANONIDN\fP بالإضافة إلى \fBAI_CANONNAME\fP. السلسلة الناتجة مُرمّزة باستخدام ترميز الإعدادات المحلية الحالية. .TP \fBAI_IDN_ALLOW_UNASSIGNED\fP .TQ \fBAI_IDN_USE_STD3_ASCII_RULES\fP سيؤدي ضبط هذه الأعلام إلى تفعيل علم IDNA_ALLOW_UNASSIGNED (السماح بنقاط كود يونيكود غير المعينة) وعلم IDNA_USE_STD3_ASCII_RULES (فحص المخرجات للتأكد من أنها اسم مضيف متوافق مع STD3) على التوالي، لاستخدامهما في معالجة IDNA. .SH "قيمة الإرجاع" .\" FIXME glibc defines the following additional errors, some which .\" can probably be returned by getaddrinfo(); they need to .\" be documented. .\" #ifdef __USE_GNU .\" #define EAI_INPROGRESS -100 /* Processing request in progress. */ .\" #define EAI_CANCELED -101 /* Request canceled. */ .\" #define EAI_NOTCANCELED -102 /* Request not canceled. */ .\" #define EAI_ALLDONE -103 /* All requests done. */ .\" #define EAI_INTR -104 /* Interrupted by a signal. */ .\" #define EAI_IDN_ENCODE -105 /* IDN encoding failed. */ .\" #endif تُرجع الدالة \fBgetaddrinfo\fP() القيمة 0 عند النجاح، أو أحد رموز الخطأ غير الصفرية التالية: .TP \fBEAI_ADDRFAMILY\fP .\" Not in SUSv3 المُضيف الشبكي المُحدد لا يمتلك أي عناوين شبكية في عائلة العناوين المطلوبة. .TP \fBEAI_AGAIN\fP أرجع خادم الأسماء إشارة فشل مؤقتة. حاول مجددًا لاحقًا. .TP \fBEAI_BADFLAGS\fP يحتوي \fIhints.ai_flags\fP على أعلام غير صالحة؛ أو تضمن \fIhints.ai_flags\fP العلم \fBAI_CANONNAME\fP وكان \fInode\fP فارغًا. .TP \fBEAI_FAIL\fP أرجع خادم الأسماء إشارة فشل دائمة. .TP \fBEAI_FAMILY\fP عائلة العناوين المطلوبة غير مدعومة. .TP \fBEAI_MEMORY\fP نفدت الذاكرة. .TP \fBEAI_NODATA\fP .\" Not in SUSv3 المُضيف الشبكي المُحدد موجود، لكنه لا يمتلك أي عناوين شبكية مُعرّفة. .TP \fBEAI_NONAME\fP \fInode\fP أو \fIservice\fP غير معروف؛ أو كلاهما فارغ؛ أو تم تحديد \fBAI_NUMERICSERV\fP في \fIhints.ai_flags\fP ولم يكن \fIservice\fP سلسلة محارف رقمية لرقم المنفذ. .TP \fBEAI_SERVICE\fP الخدمة المطلوبة غير متوفرة لنوع المقبس المطلوب. قد تكون متوفرة عبر نوع مقبس آخر. على سبيل المثال، قد يحدث هذا الخطأ إذا كانت \fIservice\fP هي "shell" (خدمة متوفرة فقط على مقابس التدفق)، وكان \fIhints.ai_protocol\fP هو \fBIPPROTO_UDP\fP، أو كان \fIhints.ai_socktype\fP هو \fBSOCK_DGRAM\fP؛ أو قد يحدث الخطأ إذا لم تكن \fIservice\fP فارغة، وكان \fIhints.ai_socktype\fP هو \fBSOCK_RAW\fP (نوع مقبس لا يدعم مفهوم الخدمات). .TP \fBEAI_SOCKTYPE\fP نوع المقبس المطلوب غير مدعوم. قد يحدث هذا، على سبيل المثال، إذا كان \fIhints.ai_socktype\fP و \fIhints.ai_protocol\fP غير متوافقين (مثل \fBSOCK_DGRAM\fP و \fBIPPROTO_TCP\fP على التوالي). .TP \fBEAI_SYSTEM\fP خطأ نظام آخر؛ يُضبط \fIerrno\fP للإشارة إلى الخطأ. .P تُترجم الدالة \fBgai_strerror\fP() رموز الخطأ هذه إلى سلسلة محارف قابلة للقراءة البشرية، مناسبة للإبلاغ عن الأخطاء. .SH الملفات \fI/etc/gai.conf\fP .SH السمات للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. الواجهة السمة القيمة T{ .na .nh \fBgetaddrinfo\fP() T} سلامة الخيوط بيئة محلية آمنة لتعدد الخيوط (MT\-Safe) T{ .na .nh \fBfreeaddrinfo\fP(), \fBgai_strerror\fP() T} سلامة الخيوط MT\-Safe .TE .SH الإصدارات .\" POSIX.1-2001, POSIX.1-2008 وفقًا لـ POSIX.1، يجب أن يؤدي تحديد \fIhints\fP كـ NULL إلى افتراض \fIai_flags\fP كـ 0. تفترض مكتبة GNU C بدلاً من ذلك قيمة \fB(AI_V4MAPPED\ |\ AI_ADDRCONFIG)\fP لهذه الحالة، حيث تُعتبر هذه القيمة تحسينًا على المواصفات. .SH المعايير POSIX.1\-2008. .TP \fBgetaddrinfo\fP() RFC\ 2553. .SH التاريخ POSIX.1\-2001. .TP \fBAI_ADDRCONFIG\fP .TQ \fBAI_ALL\fP .TQ \fBAI_V4MAPPED\fP glibc 2.3.3. .TP \fBAI_NUMERICSERV\fP glibc 2.3.4. .SH ملاحظات تدعم \fBgetaddrinfo\fP() الترميز \fIaddress\fP\fB%\fP\fIscope\-id\fP لتحديد نطاق IPv6 scope\-ID. .SH أمثلة .\" getnameinfo.3 refers to this example .\" socket.2 refers to this example .\" bind.2 refers to this example .\" connect.2 refers to this example .\" recvfrom.2 refers to this example .\" sendto.2 refers to this example توضح البرامج التالية استخدام \fBgetaddrinfo\fP()، \fBgai_strerror\fP()، \fBfreeaddrinfo\fP()، و \fBgetnameinfo\fP(3). البرامج هي خادم وعميل صدى لبيانات UDP. .SS "برنامج الخادم" .\" SRC BEGIN (server.c) \& .EX #include #include #include #include #include #include #include \& #define BUF_SIZE 500 \& int main(int argc, char *argv[]) { int sfd, s; char buf[BUF_SIZE]; ssize_t nread; socklen_t peer_addrlen; struct addrinfo hints; struct addrinfo *result, *rp; struct sockaddr_storage peer_addr; \& if (argc != 2) { fprintf(stderr, "Usage: %s port\[rs]n", argv[0]); exit(EXIT_FAILURE); } \& memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */ hints.ai_socktype = SOCK_DGRAM; /* Datagram socket */ hints.ai_flags = AI_PASSIVE; /* For wildcard IP address */ hints.ai_protocol = 0; /* Any protocol */ hints.ai_canonname = NULL; hints.ai_addr = NULL; hints.ai_next = NULL; \& s = getaddrinfo(NULL, argv[1], &hints, &result); if (s != 0) { fprintf(stderr, "getaddrinfo: %s\[rs]n", gai_strerror(s)); exit(EXIT_FAILURE); } \& /* getaddrinfo() returns a list of address structures. Try each address until we successfully bind(2). If socket(2) (or bind(2)) fails, we (close the socket and) try the next address. */ \& for (rp = result; rp != NULL; rp = rp\->ai_next) { sfd = socket(rp\->ai_family, rp\->ai_socktype, rp\->ai_protocol); if (sfd == \-1) continue; \& if (bind(sfd, rp\->ai_addr, rp\->ai_addrlen) == 0) break; /* Success */ \& close(sfd); } \& freeaddrinfo(result); /* No longer needed */ \& if (rp == NULL) { /* No address succeeded */ fprintf(stderr, "Could not bind\[rs]n"); exit(EXIT_FAILURE); } \& /* Read datagrams and echo them back to sender. */ \& for (;;) { char host[NI_MAXHOST], service[NI_MAXSERV]; \& peer_addrlen = sizeof(peer_addr); nread = recvfrom(sfd, buf, BUF_SIZE, 0, (struct sockaddr *) &peer_addr, &peer_addrlen); if (nread == \-1) continue; /* Ignore failed request */ \& s = getnameinfo((struct sockaddr *) &peer_addr, peer_addrlen, host, NI_MAXHOST, service, NI_MAXSERV, NI_NUMERICSERV); if (s == 0) printf("Received %zd bytes from %s:%s\[rs]n", nread, host, service); else fprintf(stderr, "getnameinfo: %s\[rs]n", gai_strerror(s)); \& if (sendto(sfd, buf, nread, 0, (struct sockaddr *) &peer_addr, peer_addrlen) != nread) { fprintf(stderr, "Error sending response\[rs]n"); } } } .EE .\" SRC END .SS "برنامج العميل" .\" SRC BEGIN (client.c) \& .EX #include #include #include #include #include #include #include \& #define BUF_SIZE 500 \& int main(int argc, char *argv[]) { int sfd, s; char buf[BUF_SIZE]; size_t size; ssize_t nread; struct addrinfo hints; struct addrinfo *result, *rp; \& if (argc < 3) { fprintf(stderr, "Usage: %s host port msg...\[rs]n", argv[0]); exit(EXIT_FAILURE); } \& /* Obtain address(es) matching host/port. */ \& memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */ hints.ai_socktype = SOCK_DGRAM; /* Datagram socket */ hints.ai_flags = 0; hints.ai_protocol = 0; /* Any protocol */ \& s = getaddrinfo(argv[1], argv[2], &hints, &result); if (s != 0) { fprintf(stderr, "getaddrinfo: %s\[rs]n", gai_strerror(s)); exit(EXIT_FAILURE); } \& /* getaddrinfo() returns a list of address structures. Try each address until we successfully connect(2). If socket(2) (or connect(2)) fails, we (close the socket and) try the next address. */ \& for (rp = result; rp != NULL; rp = rp\->ai_next) { sfd = socket(rp\->ai_family, rp\->ai_socktype, rp\->ai_protocol); if (sfd == \-1) continue; \& if (connect(sfd, rp\->ai_addr, rp\->ai_addrlen) != \-1) break; /* Success */ \& close(sfd); } \& freeaddrinfo(result); /* No longer needed */ \& if (rp == NULL) { /* No address succeeded */ fprintf(stderr, "Could not connect\[rs]n"); exit(EXIT_FAILURE); } \& /* Send remaining command\-line arguments as separate datagrams, and read responses from server. */ \& for (size_t j = 3; j < argc; j++) { size = strlen(argv[j]) + 1; /* +1 for terminating null byte */ \& if (size > BUF_SIZE) { fprintf(stderr, "Ignoring long message in argument %zu\[rs]n", j); continue; } \& if (write(sfd, argv[j], size) != size) { fprintf(stderr, "partial/failed write\[rs]n"); exit(EXIT_FAILURE); } \& nread = read(sfd, buf, BUF_SIZE); if (nread == \-1) { perror("read"); exit(EXIT_FAILURE); } \& printf("Received %zd bytes: %s\[rs]n", nread, buf); } \& exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "انظر أيضًا" .\" .BR getipnodebyaddr (3), .\" .BR getipnodebyname (3), \fBgetaddrinfo_a\fP(3), \fBgethostbyname\fP(3), \fBgetnameinfo\fP(3), \fBinet\fP(3), \fBgai.conf\fP(5), \fBhostname\fP(7), \fBip\fP(7) .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .