Presa Linux blocco UDP non riceveranno
-
02-10-2019 - |
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
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.