كيف يمكنني الحصول على مأخذ مجاني الميناء ؟ C++

StackOverflow https://stackoverflow.com/questions/803012

  •  03-07-2019
  •  | 
  •  

سؤال

أنا أكتب UDP اختبار العميل/الخادم و أريد الحصول على ذلك من خلال جدار الحماية.من المفترض أن كل ما عليك القيام به هو أن يكون كلا الجانبين إرسال الصحيح IP server.الحصول على IP ليست مشكلة ولكن كيف يمكنني الحصول على العميل اختيار عشوائي الميناء الحر وتقديم تقرير إلى المستخدم ؟ أنا في نهاية المطاف تريد أن الاتصال الخاطبة server ولكن الآن أنا بحاجة بسيطة نموذج العمل و أود أن cout رقم المنفذ حتى صديقي/اختبار يمكن أن ترسل لي # عبر الدردشة حتى نتمكن من اختبار.

كيف يمكنني الحصول على رقم المنفذ?آسف طويلة desc.لقد لاحظت الكثير من الناس تقول لي لا تفعل ما أطلبه منك عندما لا تعطي desc :(

هل كانت مفيدة؟

المحلول

استخدام التقنية العالية الأجل, هذا هو في الواقع رديء جدا المشكلة أو حتى زوج من رديء المشاكل.اعتمادا على تكوين جدار الحماية ، فإنه عادة ما تسمح الردود من آخر نقطة النهاية على IP نقطة النهاية كما جاء بناء على طلب من.لذا...إذا كان لك صديق يتلقى بيانات UDP باستخدام شيء من هذا القبيل recvfrom() نظام الاتصال العنوان المعلمة سوف تحصل على IP نقطة النهاية المعلومات للرد على.حتى النهاية الأخرى ينبغي أن تكون قادرة على الاستجابة مع sendto() باستخدام نفس معالجة المعلومات.شيء من هذا القبيل:

/* initiator */
struct sockaddr_in hisaddr;
memset(&hisaddr, 0, sizeof(hisaddr));
hisaddr.sin_addr.s_addr = htonl(target_ip);
hisaddr.sin_port = htons(target_port);
sendto(sd, msg_ptr, msg_sz, 0, (struct sockaddr*)&hisaddr, sizeof(hisaddr));

/* receiver */
struct sockaddr_in peeraddr;
socklen_t peer_sz = sizeof(peeraddr);
recvfrom(sd, buf_ptr, buf_sz, 0, (struct sockaddr*)&peeraddr, &peer_sz);
/* build response */
sendto(sd, msg_ptr, msg_sz, 0, (struct sockaddr*)&peeraddr, peer_sz);

على peeraddr على الجانب الآخر سيكون الخارجية عنوان أو أكثر بشكل صحيح ، عنوان IP من جدار الحماية الخاص بك ورقم المنفذ الذي اختار استخدام.رقم المنفذ الذي تحدده في التعليمات البرمجية الخاصة بك قد تكون مختلفة تماما من الميناء أن صديقك سوف تضطر إلى إرسال البيانات إلى.في نهاية المطاف قد لا يهم في أي ميناء اخترت استخدام منذ جدار الحماية يمكن إرسال واستقبال على مختلف تماما الميناء - وهذا هو ما ترجمة عنوان الشبكة هو كل شيء.أنصح القراءة RFC3235 للحصول على بعض النصائح حول كيفية التغلب على هذه العقبة.

أفضل نهج IMHO هو:

  1. اسمحوا OS اختيار ميناء إما عن طريق استدعاء bind() مع صفر رقم المنفذ أو تخطي ربط تماما
  2. بعد أن العميل يتلقى معالجة المعلومات من طبقة مأخذ التوصيل (على سبيل المثال الخامس والسادس الحجج recvfrom())
  3. يرسل العميل الاستجابة إلى نقطة النهاية استردادها في الخطوة السابقة
  4. قرص تكوينات جدار الحماية حتى الخطوات السابقة العمل

بالطبع كل من السحر هو في الخطوة الأخيرة.إذا كان يمكنك تعطيل NAT أو التأكد من أن جدار الحماية لن منافذ التبديل ، ثم تسمير أسفل رقم منفذ ، bind-ing إلى أنه سيتم العمل أيضا.قد ترغب في إلقاء نظرة على %WINDIR%\system32\drivers\etc\services (أو /etc/services اعتمادا على نظام التشغيل الخاص بك الميل) للحصول على فكرة عن ما أرقام المنافذ المحجوزة أو عموما في استخدام.

نصائح أخرى

وبصفة عامة - كنت - كما المطور - اختيار الميناء. يمكنك تعيين تطبيق لقراءة المنفذ من ملف التكوين أو المستخدم الإدخال - ولكن لا جدار الحماية سحرية سوف اقول لكم ما الميناء لاستخدام ...

إذا أنا فهم السؤال بشكل صحيح، وأنا لست متأكد من أن هناك وسيلة لتفعل ما تريد برمجيا (وحتى لو كان هناك، وأنا لا أعتقد أنه هو النهج الصحيح). أعتقد أنك بحاجة إلى العثور على المنفذ الذي ليس قيد الاستخدام على الجهاز الخادم (وربما مختلفة أو نفس المنفذ على جهاز العميل، إذا الاتصال هو ثنائي الاتجاه) وذلك المنفذ يجب أن تكون قادرة على المرور عبر جدار الحماية الخاص بك . أفترض منذ كنت أقول "الحصول على IP ليست مشكلة"، وكنت قد تكوين جدار الحماية بالفعل لإعادة توجيه بعض أو كافة المنافذ لكمبيوتر معين داخل جدار الحماية؟ إذا كان الأمر كذلك، المنفذ الذي يسعى هو واحد من تلك التي تم إعادة توجيهها. يمكنك فقط اختيار واحد التعسفي، طالما لا توجد خدمة أخرى قيد التشغيل على هذا المنفذ. محجوزة الموانئ أدناه 1024، وذلك ربما كنت ترغب في اختيار عدد أكبر من ذلك. يمكنك استخدام أداة portscanning بسيطة مثل NMAP لمعرفة الخدمات التي يتم تشغيلها على جهاز الكمبيوتر الخاص بك على المنافذ التي واختيار مختلفة واحدة. لاحظ أنه nmap يمكن أن ينخدع الجدران النارية وقواعد bind مختلف عندما يتم إنشاء مآخذ.

وأعتقد أنك أفضل حالا اختيار منفذ ثابت بدلا من الاعتماد على رقم المنفذ عشوائي اختاره O / S.

إذا كنت تستخدم منفذ عشوائي كنت قد لتغيير إعدادات جدار الحماية الخاص بك في كل مرة تقوم بتشغيل البرنامج.

إذا كنت تستخدم الاختيار WINSOCK هذا الرابط: http://msdn.microsoft.com/en-us /library/aa280717(VS.60).aspx أساسا لديك 2 الخيارات تعيين المنفذ إلى 0 و السماح للنظام تعيين أنت واحد أو اختار واحد عشوائي محاولة لفتح مقبس إذا كان لا يعمل محاولة أخرى (تأكد من توجيه واضح من الموانئ محفوظة)

وربط () مأخذ قبل إرسال البيانات الخاصة بك. تحديد ميناء 0 لربط ()، وسوف OS اختيار منفذ غير مستخدم بالنسبة لك. ثم يمكنك استخدام getsockname () لمعرفة ما اختارت ميناء جائزة القمة العالمية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top