2016-05-13 12 views
1

Ich habe 2 Programme laufen (program1, program2), beide senden und empfangen UDP-Pakete von einander mit Sockets ich initialisiert.sendto broadcast funktioniert, aber Unicast nicht

Mein Problem ist, wenn ich eine Sendung den TRANSMIT (TX) Socket von Programm1 senden, empfängt Programm2 die Nachricht, aber wenn ich eine Unicast (die IP zu Programm2) senden, empfängt Programm2 nicht die Nachricht ... sendto "Funktion in Programm1 gibt die richtige Menge an gesendeten Paketen zurück, so dass sie gesendet wird.

Das macht für mich keinen Sinn, da die IP in der Netzmaske der Sendung ist ... Mein Unicast sollte auch funktionieren? Ich brauche den Unicast-Tx, um auch zu arbeiten.

Kann mir jemand sagen, was ich falsch mache? Ich glaube, ich habe meinen Sockel korrekt eingerichtet und richtig konfiguriert oder es würde gar nicht funktionieren. Das Stück Code, das ich Probleme auf habe, ist unten:

Program1 Tx:

if (ip == INADDR_BROADCAST || ip == 0) 
{ 
    addr.sin_addr.s_addr = htonl(bcast); 
} 
else 
{ 
    addr.sin_addr.s_addr = htonl(ip); 
    // If I comment above and uncomment below, program works. 
    //addr.sin_addr.s_addr = htonl(bcast); 
} 
addr.sin_port = htons(port); 


ret = sendto(fd, 
       buf, 
       n, 
       flags, 
       addr, 
       addr_len); 

Einige Konfigurationen meiner socket1 ist:

// Set up tx socket 
s_addr.sin_family  = AF_INET; 
s_addr.sin_addr.s_addr = htonl(own_ip); 
s_addr.sin_port  = htons(6060); 

Program2 Rx:

rx_len = recvfrom(fd, 
        &rx_msg, 
        sizeof (rx_msg), 
        0, 
        (struct sockaddr *)&c_addr, 
        &len); 

Einige Konfigurationen meines Socket2 sind:

s_addr.sin_family  = AF_INET; 
// Must be INADDR_ANY to receive broadcasts 
s_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
s_addr.sin_port  = htons(6070); 
if ((ret = bind(fd, 
        (struct sockaddr *)&s_addr, 
        sizeof (s_addr))) != 0) 
+0

Ohne den Wert von "ip" im Fehlerfall zu kennen, ist es unmöglich, Ihre Frage zu beantworten. Offensichtlich stimmt etwas nicht damit. – EJP

Antwort

0

Möglicherweise müssen Sie den Rest Ihres sockaddr_in addr Struktur initialisieren, wie Sie für Ihre Steckdose tun 1.

Versuchen:

if (ip == INADDR_BROADCAST || ip == 0) 
{ 
    addr.sin_addr.s_addr = htonl(bcast); 
} 
else 
{ 
    addr.sin_family = AF_INET; 
    addr.sin_port = htons(6070); 
    inet_pton(AF_INET, ip, &addr.sin_addr.s_addr); 
    memset(addr.sin_zero, 0, sizeof(addr.sin_zero)); 
} 

Auch bemerke ich inet_pton die Adresse Mitglied zu füllen verwendet, nach Beej's Guide (das ist die Hauptressource, die ich verwendet habe, um über Netzwerk-Sockets zu lernen). Sie müssen dafür #include <arpa/inet.h> (wenn Sie nicht bereits haben).

Hoffe, das hilft!

Verwandte Themen