Domanda

Sto openning un UDP blocco presa su una macchina Ubuntu, si va di successo (nessun errore restituito).

Quando si inviano dati a quella macchina e la porta da un'altra macchina della ricezione violazioni doesnt e in un Wireshark sniffer vedo e ICMP di errore "Porta irraggiungibile".

ho pensato che potrebbe essere un problema di iptables e ha aperto la porta per accettare.

Altri suggerimenti Come eseguire il debug questo?

Grazie.

Timmy

È stato utile?

Soluzione

Si dovrebbe mostrare un banco di prova minimo.

vedi il tuo processo

sudo netstat -4lp

? Che indirizzo locale è il suo legame socket (come riportato da netstat)?

Altri suggerimenti

Io di solito uso netcat per capire se il problema deriva dalla rete / firewall o dal mio codice

provare a eseguire un server di prova con netcat: ad es.

nc -l -u -p 9999 

si aprirà ed ascoltare una presa UDP, porta 9999.

Ora si può provare a inviare un pacchetto dallo stesso o da un altro computer utilizzando

nc -u <ipaddress> 9999

Quindi digitare qualcosa e vedere se si raggiunge il primo computer.

Ci sono un sacco di altri animali fresche in netcat, avere uno sguardo sul manuale.

Stai usando bind() correttamente associate il socket alla porta locale?

Ti sei ricordato di passare il numero della porta locale attraverso htons() per convertirlo in ordine di byte di rete?

Che valore ha prodotto bind()?

Prova questo semplice server e vedere se funziona per voi:

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

Vedere se tutti i passaggi richiesti ci sono nel vostro codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top