гнездо c ++ — sendto — данные не получены

Сообщество Visual Studio 2017

c ++ CLR проект

Это должен отправлять дейтаграмму UDP на адрес многоадресной рассылки.

Я отправляю без ошибок.

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

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

Sent: 13Sent: 13Sent: 13

Приемник получает этот вход

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

Вот отправляющая часть кода

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);
}

Полный код сокета, если это поможет

// 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 implementationOutputDebugString(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();
}

Из того, что я прочитал.

const char * msg

должно быть правильно.

Любой совет приветствуется.

Редактировать:

Согласно Remy Lebeau

int set_sock = setsockopt (Sock, 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

-1

Решение

Трансляция в подсети — это не то же самое, что многоадресная рассылка!

Вы реализовали код для широковещания, но в качестве цели широковещания вы используете многоадресный IP-адрес, который не будет работать.

Не использовать setsockopt(SOL_SOCKET, SO_BROADCAST) вообще в этой ситуации. Вместо этого вы должны присоединиться к группе многоадресной рассылки, используя setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP) прежде чем вы сможете отправлять / получать дейтаграммы в / из группы.

Читайте MSDN для более подробной информации:

Многоадресное программирование

1

Другие решения

Оказывается…

setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP) это не ответ, данные отправляются с использованием setsockopt(SOL_SOCKET, SO_BROADCAST), Который я проверял и EJP указал.

Эта проблема egg on my face Я забыл, что данные всегда пусты в консоли, пока я не проанализирую буфер, тогда данные присутствуют.

Спасибо вам всем.

0

По вопросам рекламы [email protected]