Anonymous
Многоадресная рассылка с устройства обратной связи на сетевой адаптер
Сообщение
Anonymous » 27 сен 2024, 07:48
я пытаюсь протестировать многоадресную рассылку UDP на одном и том же хосте. поскольку у меня только одна сетевая карта, моя идея — отправить многоадресные данные на устройство с обратной связью и использовать их на сетевом адаптере.
погуглите, как отправить многоадресную рассылку данные на устройство обратной связи, я получил команды ниже
Код: Выделить всё
ifconfig lo multicast
ip route add 239.0.0.2 dev lo
route add -net 224.0.0.0 netmask 240.0.0.0 dev lo
ifconfig lo multicast
ниже приведены примеры приложений
sender.c
Код: Выделить всё
#include
#include
#include
#include
#include
#include
#include
#include
int main()
{
const int delay_secs = 0;
const char *message2 = "Hello, World!";
unsigned long counter = 0;
char message[8192] = {0};
int fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd < 0)
{
perror("socket(1)");
return 1;
}
struct ip_mreq mreq;
memset(&mreq, 0, sizeof(mreq));
mreq.imr_interface.s_addr = inet_addr("127.0.0.1");
if (
setsockopt(
fd, IPPROTO_IP, IP_MULTICAST_IF, (char *)&mreq, sizeof(mreq)) < 0)
{
perror("setsockopt(1)");
return 1;
}
char loopch = 1;
if(setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&loopch, sizeof(loopch)) < 0)
{
perror("setsockopt(2)");
return 1;
}
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("239.0.0.2");
addr.sin_port = htons(1234);
while (1)
{
char ch = 0;
snprintf(message, 8192, "%s-%lu", message2, ++counter);
int nbytes = sendto(
fd,
message,
strlen(message),
0,
(struct sockaddr *)&addr,
sizeof(addr));
if (nbytes < 0)
{
perror("sendto");
return 1;
}
sleep(delay_secs);
}
return 0;
}
listner.c
Код: Выделить всё
#include
#include
#include
#include
#include
#include
#include
#include
#define MSGBUFSIZE 8192
int main()
{
int fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd < 0)
{
perror("socket");
return 1;
}
u_int yes = 1;
if (
setsockopt(
fd, SOL_SOCKET, SO_REUSEADDR, (char *)&yes, sizeof(yes)) < 0)
{
perror("Reusing ADDR failed");
return 1;
}
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("239.0.0.2");
addr.sin_port = htons(1234);
if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{
perror("bind");
return 1;
}
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr("239.0.0.2");
mreq.imr_interface.s_addr = inet_addr("192.168.2.6"); //local wifi address
if (
setsockopt(
fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq)) < 0)
{
perror("setsockopt");
return 1;
}
while (1)
{
char msgbuf[MSGBUFSIZE];
int addrlen = sizeof(addr);
int nbytes = recvfrom(
fd,
msgbuf,
MSGBUFSIZE,
0,
(struct sockaddr *)&addr,
&addrlen);
if (nbytes < 0)
{
perror("recvfrom");
return 1;
}
msgbuf[nbytes] = '\0';
puts(msgbuf);
}
return 0;
}
что именно здесь не так. Я пытаюсь проверить свою личную настройку, на которой работает Ubuntu.
Подробнее здесь:
https://stackoverflow.com/questions/790 ... ice-to-nic
1727412481
Anonymous
я пытаюсь протестировать многоадресную рассылку UDP на одном и том же хосте. поскольку у меня только одна сетевая карта, моя идея — отправить многоадресные данные на устройство с обратной связью и использовать их на сетевом адаптере. погуглите, как отправить многоадресную рассылку данные на устройство обратной связи, я получил команды ниже [code]ifconfig lo multicast ip route add 239.0.0.2 dev lo route add -net 224.0.0.0 netmask 240.0.0.0 dev lo ifconfig lo multicast [/code] ниже приведены примеры приложений [b]sender.c[/b] [code]#include #include #include #include #include #include #include #include int main() { const int delay_secs = 0; const char *message2 = "Hello, World!"; unsigned long counter = 0; char message[8192] = {0}; int fd = socket(AF_INET, SOCK_DGRAM, 0); if (fd < 0) { perror("socket(1)"); return 1; } struct ip_mreq mreq; memset(&mreq, 0, sizeof(mreq)); mreq.imr_interface.s_addr = inet_addr("127.0.0.1"); if ( setsockopt( fd, IPPROTO_IP, IP_MULTICAST_IF, (char *)&mreq, sizeof(mreq)) < 0) { perror("setsockopt(1)"); return 1; } char loopch = 1; if(setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&loopch, sizeof(loopch)) < 0) { perror("setsockopt(2)"); return 1; } struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr("239.0.0.2"); addr.sin_port = htons(1234); while (1) { char ch = 0; snprintf(message, 8192, "%s-%lu", message2, ++counter); int nbytes = sendto( fd, message, strlen(message), 0, (struct sockaddr *)&addr, sizeof(addr)); if (nbytes < 0) { perror("sendto"); return 1; } sleep(delay_secs); } return 0; } [/code] [b]listner.c[/b] [code] #include #include #include #include #include #include #include #include #define MSGBUFSIZE 8192 int main() { int fd = socket(AF_INET, SOCK_DGRAM, 0); if (fd < 0) { perror("socket"); return 1; } u_int yes = 1; if ( setsockopt( fd, SOL_SOCKET, SO_REUSEADDR, (char *)&yes, sizeof(yes)) < 0) { perror("Reusing ADDR failed"); return 1; } struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr("239.0.0.2"); addr.sin_port = htons(1234); if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind"); return 1; } struct ip_mreq mreq; mreq.imr_multiaddr.s_addr = inet_addr("239.0.0.2"); mreq.imr_interface.s_addr = inet_addr("192.168.2.6"); //local wifi address if ( setsockopt( fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq)) < 0) { perror("setsockopt"); return 1; } while (1) { char msgbuf[MSGBUFSIZE]; int addrlen = sizeof(addr); int nbytes = recvfrom( fd, msgbuf, MSGBUFSIZE, 0, (struct sockaddr *)&addr, &addrlen); if (nbytes < 0) { perror("recvfrom"); return 1; } msgbuf[nbytes] = '\0'; puts(msgbuf); } return 0; } [/code] что именно здесь не так. Я пытаюсь проверить свою личную настройку, на которой работает Ubuntu. Подробнее здесь: [url]https://stackoverflow.com/questions/79029854/multicast-from-loopback-device-to-nic[/url]