Frage

Ich bin ein udp blockierenden Socket auf einem ubuntu Maschine openning, es geht erfolgreich (keine Fehler zurückgegeben).

Wenn Daten zu dieser Maschine und Port von einer anderen Maschine zu senden erhalten die doesnt Verletzungen und in einem wireshark Sniffer ich sehe und Icmp Fehler „Port nicht erreichbar“.

Ich dachte, es könnte ein Problem sein, iptables und öffnete den Port für nehmen.

Alle anderen Vorschläge, wie dies zu debuggen?

Danke.

Timmy

War es hilfreich?

Lösung

Sie sollten einen minimalen Testfall zeigen.

Sehen Sie, Ihren Prozess in

sudo netstat -4lp

? Welche lokale Adresse ist die Buchse gebunden (wie von netstat berichtete)?

Andere Tipps

ich in die Regel netcat verwenden, um herauszufinden, ob das Problem aus dem Netz kommt / Firewall oder von meinem eigenen Code

versuchen, einen Testserver mit netcat ausgeführt wird: zB.

nc -l -u -p 9999 

wird ein UDP-Sockets öffnen und hören, Port 9999.

Jetzt können Sie versuchen, ein Paket, das von den gleichen oder von einem anderen Computer zu senden mit

nc -u <ipaddress> 9999

Dann etwas geben und sehen, ob es den ersten Computer erreicht.

Es gibt eine Menge von anderen kühlen stopft in netcat, einen Blick auf das Handbuch.

Sind Sie mit bind() richtig binden die Buchse an den lokalen Port?

Haben Erinnern Sie sich die lokale Port-Nummer durch htons() zu übergeben es an Netzwerk-Byte-Reihenfolge zu umwandeln?

Was Wert hat bind() Rückkehr?

Versuchen Sie diesen einfachen Server und sehen, ob es für Sie arbeitet:

#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;
}

ob alle erforderlichen Schritte sind in Ihrem Code.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top