Question

Je suis une prise Openning blocage udp sur une machine ubuntu, il va de succès (pas d'erreurs retour).

Lors de l'envoi de données à cette machine et le port d'une autre machine de réception des infractions ne marche pas et dans un Wireshark sniffer je vois et erreur ICMP « port injoignable ».

Je pensais que cela pourrait être un problème iptables et a ouvert le port pour accepter.

Toutes les autres suggestions comment débugger?

Merci.

Timmy

Était-ce utile?

La solution

Vous devez afficher un test minimal.

Est-ce que vous voyez votre processus

sudo netstat -4lp

? Quelle adresse locale est son socket lié à (tel que rapporté par netstat)?

Autres conseils

J'utilise habituellement netcat pour savoir si le problème provient du réseau / pare-feu ou de mon propre code

essayez d'exécuter un serveur de test avec netcat: par exemple.

nc -l -u -p 9999 

ouvrira ses portes et écouter une prise udp, le port 9999.

Maintenant, vous pouvez essayer d'envoyer un paquet à partir du même ou d'un autre ordinateur en utilisant

nc -u <ipaddress> 9999

Ensuite, tapez quelque chose et voir si elle atteint le premier ordinateur.

Il y a beaucoup d'autres denrées fraîches dans netcat, un coup d'oeil sur le manuel.

Utilisez-vous bind() correctement lier la prise au port local?

Avez-vous pensé à passer le numéro de port local par htons() pour le convertir à l'ordre des octets du réseau?

Quelle valeur a le retour de bind()?

Essayez ce simple serveur et voir si cela fonctionne pour vous:

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

Voir si toutes les étapes nécessaires sont là dans votre code.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top