2017-07-08 6 views
-1

Visual Studio 2017 GemeinschaftsC++ Buchse - sendto - keine Daten empfangen

C++ CLR Projekt

Es sollte ein UDP-Datagramm an eine Multicast-Adresse senden.

Ich sende ohne Fehler.

-------------- 
MULTICAST 
------------------- 
'Project2.exe' (Win32): Loaded 'C:\Windows\SysWOW64\mswsock.dll'. Symbols loaded. 

MULTICAST ---- 
IP:224.0.0.2 
PORT:7125 
------------- 

Sent: 13 


Sent: 13 


Sent: 13 

Der Empfänger erhält diesen Eingang

{"socketId":0,"data":{},"remoteAddress":"192.168.0.80","remotePort":2535} 

Hier wird der Sendeteil des Codes ist

const char *msg = "1 2 3 4 5 6 7"; 


while (sending) { 

    //swprintf(str, L"\nMSG: \n%c ", channels); 
    //OutputDebugString(str); 

    // Send a message to the multicasting address. 
    int ret = sendto(Sock, msg, strlen(msg), 0, (struct sockaddr FAR *) &dest_sin, sizeof(dest_sin)); 

    swprintf(str, L"\nSent: %d \n\n", ret); 
    OutputDebugString(str); 

    if (ret == SOCKET_ERROR) 
    { 
     swprintf(str, L"\nsendto failed! Error: %d ", WSAGetLastError()); 
     OutputDebugString(str); 

     closesocket(Sock); 
     sending = false; 
    } 
    Sleep(66); 
} 

Voll Code Buchse, wenn es

// Sent message string 
TCHAR szError[100];    // Error message string 
SOCKET Sock = INVALID_SOCKET;  // Datagram window socket 

SOCKADDR_IN source_sin,   // Source socket address 
    dest_sin;    // Destination socket address 

WSADATA WSAData;     // Contains details of the 
            // Winsock implementation 


OutputDebugString(L"\n--------------\nMULTICAST\n-------------------\n"); 

// Initialize Winsock. 
if (WSAStartup(MAKEWORD(1, 1), &WSAData) != 0) 
{ 
    swprintf(str, TEXT("WSAStartup failed! Error: %d"), WSAGetLastError()); 
    OutputDebugString(str); 
    return FALSE; 
} 

// Create a datagram window socket, Sock. 
if ((Sock = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET) 
{ 
    swprintf(str, TEXT("Allocating socket failed! Error: %d"), WSAGetLastError()); 
    OutputDebugString(str); 
    return FALSE; 
} 

// Fill out source socket's address information. 
source_sin.sin_family = AF_INET; 
source_sin.sin_port = htons(SOURCE_PORT); 
source_sin.sin_addr.s_addr = htonl(INADDR_ANY); 

// Associate the source socket's address with the socket, Sock. 
if (bind(Sock, 
    (struct sockaddr FAR *) &source_sin, 
    sizeof(source_sin)) == SOCKET_ERROR) 
{ 
    swprintf(str, TEXT("Binding socket failed! Error: %d"), WSAGetLastError()); 
    OutputDebugString(str); 
    closesocket(Sock); 
    return FALSE; 
} 

// Set the Time-to-Live of the multicast. 
int set_sock = setsockopt(Sock, SOL_SOCKET, SO_BROADCAST, (char FAR *)&iOptVal, sizeof(int)); 
if (set_sock == SOCKET_ERROR) 
{ 
    swprintf(str, TEXT("\n`setsockopt` failed! Error: %d\n\n"), WSAGetLastError()); 
    OutputDebugString(str); 
    closesocket(Sock); 
    return FALSE; 
} 


// Fill out the desination socket's address information. 
dest_sin.sin_family = AF_INET; 
dest_sin.sin_port = ntohs(mcast_port); 
dest_sin.sin_addr.s_addr = inet_addr(mcast_ip); 

swprintf(str, L"\nMULTICAST ----\nIP:%s\nPORT:%d\n-------------\n", mcast_ip, mcast_port); 
OutputDebugString(str); 


const char *msg = "1 2 3 4 5 6 7"; 


while (sending) { 

    //swprintf(str, L"\nMSG: \n%c ", channels); 
    //OutputDebugString(str); 

    // Send a message to the multicasting address. 
    int ret = sendto(Sock, msg, strlen(msg), 0, (struct sockaddr FAR *) &dest_sin, sizeof(dest_sin)); 

    swprintf(str, L"\nSent: %d \n\n", ret); 
    OutputDebugString(str); 

    if (ret == SOCKET_ERROR) 
    { 
     swprintf(str, L"\nsendto failed! Error: %d ", WSAGetLastError()); 
     OutputDebugString(str); 

     closesocket(Sock); 
     sending = false; 
    } 
    Sleep(66); 
} 


OutputDebugString(L"\n---------------------\nMULTICAST DONE\n---------------------\n"); 


if (!sending) { 
    // Disable sending on Sock before closing it. 
    shutdown(Sock, 0x01); 

    // Close Sock. 
    closesocket(Sock); 

    WSACleanup(); 
} 

Von dem, was hilft I habe gelesen.

const char * msg

sollte korrekt sein.?

Jede Beratung wird geschätzt.

Edit:

Per Remy Lebeau

int set_sock = setsockopt (Socke, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char far *) & iOptVal, sizeof (int));

Error: 10042 -- An unknown, invalid or unsupported option or level was specified in a getsockopt or setsockopt call.

IP_ADD_MEMBERSHIP = 5

Antwort

1

Subnet Broadcasting ist nicht das Gleiche wie Multicasting!

Sie haben Code für Broadcasting implementiert, aber Sie verwenden eine Multicast-IP-Adresse als Broadcastziel, die nicht funktioniert.

Verwenden Sie in dieser Situation nicht setsockopt(SOL_SOCKET, SO_BROADCAST). Stattdessen müssen Sie der Multicast-Gruppe mithilfe von setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP) beitreten, bevor Sie dann Datagramme an die Gruppe senden bzw. von ihr empfangen können.

Lesen Sie für weitere Informationen zu MSDN:

Multicast Programming

+1

Empfangen.Sie müssen der Gruppe nicht beitreten, um an sie zu senden. – EJP

+0

Warum die down vote? Es ist eine Frage ... wenn ich die Antwort wüsste, wäre ich nicht hier. –

+0

'IP_ADD_MEMBERSHIP' nimmt einen Zeiger auf eine [' ip_mreq'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms738695.aspx) Struktur als Eingabe, nicht als 'int'. Lesen Sie die Dokumentation: [IPPROTO_IP Socket-Optionen] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms738586.aspx) –

0

Es stellte sich heraus ...

setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP) ist nicht die Antwort, die Daten unter Verwendung von setsockopt(SOL_SOCKET, SO_BROADCAST) gesendet. Was ich getestet habe und EJP aufgezeigt habe.

Das Problem egg on my face war ich habe vergessen, dass die Daten in der Konsole immer leer ist, bis ich den Puffer analysieren, dann Daten vorhanden ist.

Danke euch allen.

Verwandte Themen