Linux blockiert UDP-Sockets nicht erhalten
-
02-10-2019 - |
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
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.