سؤال

أنا أفتح مقبس حظر UDP على جهاز Ubuntu ، يصبح ناجحًا (لم يتم إرجاع أي أخطاء).

عند إرسال البيانات إلى هذا الجهاز والمنفذ من جهاز آخر ، لا ينتهك الاستلام وفي sniffer wireshark أراه وخطأ ICMP "منفذ غير قابل للوصول".

على الرغم من أنها قد تكون مشكلة iPtables وفتحت المنفذ لقبولها.

أي اقتراحات أخرى كيفية تصحيح هذا؟

شكرًا.

تيمي

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

المحلول

يجب أن تظهر قضية الاختبار الحد الأدنى.

هل ترى عمليتك في

sudo netstat -4lp

؟ ما هو العنوان المحلي الذي يرتبط به مقبسه (كما ذكرت NetStat)؟

نصائح أخرى

عادة ما أستخدم netcat لمعرفة ما إذا كانت المشكلة تأتي من الشبكة/جدار الحماية أو من الكود الخاص بي

حاول تشغيل خادم اختبار مع netcat : على سبيل المثال.

nc -l -u -p 9999 

سيفتح واستمع مقبس UDP ، المنفذ 9999.

الآن يمكنك محاولة إرسال حزمة من نفس أو من كمبيوتر آخر باستخدام

nc -u <ipaddress> 9999

ثم اكتب شيئًا ومعرفة ما إذا كان يصل إلى أول جهاز كمبيوتر.

هناك الكثير من المواد الرائعة الأخرى في Netcat ، وإلقاء نظرة على الدليل.

هل تستخدم bind() لربط المقبس بشكل صحيح بالمنفذ المحلي؟

هل تذكرت تمرير رقم المنفذ المحلي من خلال htons() لتحويله إلى أمر بايت الشبكة؟

ما هي القيمة bind() إرجاع؟

جرب هذا الخادم البسيط ومعرفة ما إذا كان يعمل من أجلك:

#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define BUFSZ 4096
#define PORTNUM 1099
char buffer[BUFSZ];

int main( int argc, char* argv[] )
{
    int fd;
    struct sockaddr_in servaddr, cliaddr;
    socklen_t clilen = sizeof( cliaddr );
    ssize_t nread;

    if (( fd = socket( AF_INET, SOCK_DGRAM, 0 )) == -1 )
        err( 1, "socket" );

    bzero( &cliaddr, sizeof( cliaddr ));
    bzero( &servaddr, sizeof( servaddr ));

    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl( INADDR_ANY );
    servaddr.sin_port = htons( PORTNUM );

    if ( bind( fd, ( struct sockaddr* )&servaddr, sizeof( servaddr )) == -1 )
        err( 1, "bind" );

    printf( "bound to %s:%d\n", inet_ntoa( servaddr.sin_addr ),
        ntohs( servaddr.sin_port ));

    while (( nread = recvfrom( fd, buffer, BUFSZ, 0,
        ( struct sockaddr* )&cliaddr, &clilen )) != -1 )
    {
        printf( "received %lu bytes from %s:%d\n", nread,
            inet_ntoa( cliaddr.sin_addr ),
            ntohs( cliaddr.sin_port ));
    }

    return 1;
}

معرفة ما إذا كانت جميع الخطوات المطلوبة موجودة في الكود الخاص بك.

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