socket udp blocage Linux ne recevra pas
-
02-10-2019 - |
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
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.