Forums Neueste Beiträge
 

Warum Network unreachable mit UDP-Broadcast unter Slackware?

05/06/2013 - 09:24 von Edzard Egberts | Report spam
Gegeben sind ein UDP-Server und ein UDP-Client - der Client verschickt
Broadcast-Messages, die vom Server angezeigt werden. Das Problem besteht
darin, dass der Client von meinem Slackware-System aus nicht senden kann
- "sendto(): Network is unreachable".

Mit Fedora geht das aber - die gleiche Software sendet Broadcasts, die
von Slackware empfangen werden (eine Richtung geht also, umgekehrt aber
nicht). Das muss also eine lokale Netzwerkeinstellung sein, aber welche?
Da brauche ich einen Hinweis zur Fehlersuche.

"Network is unreachable" trifft schon einmal nicht für "ping" zu, da
können sich beide Rechner "sehen".

Der verwendete Port ist frei (làsst sich zumindest mit einem TCP-Server
belegen) und sollte sowieso irrelevant sein, da das Programm sendet.
Am Fedora-System kann es gar nicht liegen, weil das Slackware-System ja
"verbindungslos" sendet, es also völlig egal sein sollte, ob überhaupt
sonst noch etwas am Netz hàngt.

Mit "netstat" sehe ich nichts, was mir seltsam erscheint. Mit "nc" habe
ich etwas herumgespielt, aber ohne Erfolg oder neue Erkenntnisse.

Damit stehe ich so langsam völlig auf dem Schlauch und habe schon
mindestens einen Arbeitstag den Fehler gesucht - was könnte es denn noch
sein?

Einen strace hàtte ich noch zu bieten, da finde ich aber auch keinen
vorhergehenden Fehler als Ursache - es schlàgt nur das sendto() fehl:

execve("./udp_client", ["./udp_client"], [/* 25 vars */]) = 0
brk(0) = 0x804a000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or
directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size990, ...}) = 0
mmap2(NULL, 12990, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb80d7000
close(3) = 0
open("/usr/lib/libstdc++.so.6", O_RDONLY) = 3
read(3,
"\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0p\356\3\0004\0\0\0\30"...,
512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size’7648, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0xb80d6000
mmap2(NULL, 948428, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3,
0) = 0xb7fee000
mmap2(0xb80cb000, 20480, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xdd) = 0xb80cb000
mmap2(0xb80d0000, 22732, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb80d0000
close(3) = 0
open("/lib/libm.so.6", O_RDONLY) = 3
read(3,
"\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@4\0\0004\0\0\0("...,
512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size0840, ...}) = 0
mmap2(NULL, 151680, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3,
0) = 0xb7fc8000
mmap2(0xb7fec000, 8192, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x23) = 0xb7fec000
close(3) = 0
open("/usr/lib/libgcc_s.so.1", O_RDONLY) = 3
read(3,
"\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\360\30\0\0004\0\0\0\364"...,
512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_sizeQ460, ...}) = 0
mmap2(NULL, 53160, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0)
= 0xb7fbb000
mmap2(0xb7fc7000, 4096, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xb) = 0xb7fc7000
close(3) = 0
open("/lib/libc.so.6", O_RDONLY) = 3
read(3,
"\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\0h\1\0004\0\0\0\214"..., 512)
= 512
fstat64(3, {st_mode=S_IFREG|0755, st_size58350, ...}) = 0
mmap2(NULL, 1439312, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3,
0) = 0xb7e5b000
mmap2(0xb7fb5000, 12288, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x15a) = 0xb7fb5000
mmap2(0xb7fb8000, 9808, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7fb8000
close(3) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0xb7e5a000
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0xb7e59000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb7e5ab10,
limit:1048575, seg_32bit:1, contents:0, read_exec_only:0,
limit_in_pages:1, seg_not_present:0, useable:1}) = 0
mprotect(0xb7fb5000, 8192, PROT_READ) = 0
mprotect(0xb7fec000, 4096, PROT_READ) = 0
mprotect(0xb80cb000, 16384, PROT_READ) = 0
mprotect(0xb80fa000, 4096, PROT_READ) = 0
munmap(0xb80d7000, 12990) = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP) = 3
setsockopt(3, SOL_SOCKET, SO_BROADCAST, [1], 4) = 0
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(4, 64), ...}) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B115200 opost isig icanon echo
...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0xb80da000
write(1, "Sending packet 0"..., 17) = 17
sendto(3, "This is packet
0\0\270\2762\0\0\364\257\17\270\4\343\304\277="..., 512, 0,
{sa_family¯_INET, sin_port=htons(10010),
sin_addr=inet_addr("255.255.255.255")}, 16) = -1 ENETUNREACH (Network is
unreachable)
dup(2) = 4
fcntl64(4, F_GETFL) = 0x8002 (flags O_RDWR|O_LARGEFILE)
brk(0) = 0x804a000
brk(0x806b000) = 0x806b000
fstat64(4, {st_mode=S_IFCHR|0620, st_rdev=makedev(4, 64), ...}) = 0
ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, {B115200 opost isig icanon echo
...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0xb80d9000
_llseek(4, 0, 0xbfc4df14, SEEK_CUR) = -1 ESPIPE (Illegal seek)
write(4, "sendto(): Network is unreachable"..., 33) = 33
close(4) = 0
munmap(0xb80d9000, 4096) = 0
exit_group(1) = ?
 

Lesen sie die antworten

#1 Edzard Egberts
05/06/2013 - 09:35 | Warnen spam
Edzard Egberts schrieb:
Gegeben sind ein UDP-Server und ein UDP-Client


Einen strace hàtte ich noch zu bieten



Der dazugehörige Code ist vielleicht auch noch von Interesse:

// UDP-Client
//
// Version 1
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h> // exit()
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <cstring>
using std::memset;

#define BUFLEN 512
#define NPACK 10
#define PORT 10010

void diep(const char *s)
{
perror(s);
exit(1);
}

int main(void)
{ // UDP-Client, sendet 10 Datenpakete an SRV_IP.
// Für UDP muss der Socket auf Typ SOCK_DGRAM gesetzt werden.
struct sockaddr_in si_other;
socklen_t slen=sizeof(si_other);
char buf[BUFLEN];

int s;
if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1) diep("socket");

memset((char *) &si_other, 0, sizeof(si_other));
si_other.sin_family = AF_INET; // Internetverbindung
si_other.sin_port = htons(PORT); // Angegebener Port
si_other.sin_addr.s_addr= htonl(INADDR_BROADCAST); // Vorgegebene
Broadcast-Adresse eintragen

int broadcastOn= 1;
if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, &broadcastOn, 4)== -1)
diep("Setsockopt");
// Erst dieser Befehl ermöglicht den Broadcast, ansonsten meldet
sendto() "Permission denied"

for (int i=0; i<NPACK; i++) {
printf("Sending packet %d", i);
sprintf(buf, "This is packet %d", i);
if (sendto(s, buf, BUFLEN, 0, (sockaddr*) &si_other, slen)==-1)
diep("sendto()");
}
close(s);
return 0;
}

Ähnliche fragen