Я все еще получаю практическое применение в сетевом программировании для Linux, и, пожалуйста, не стесняйтесь очищать свое понимание, если вы чувствуете его расплывчатое или неправильное.2 пользовательских космических программы по туннелю с использованием multicast
Запрос:
Я испекла Linux изображение, используя Yocto проект, который похож на ядро образа-минимален. Эта часть не имеет отношения к запросу. Я загружаю это изображение с помощью эмулятора QEMU, и когда QEMU загружается, он создает интерфейс sudo по имени tap0. IP-адрес QEMU равен 192.168.7.2, а tap0 - IP 192.168.7.1.
Теперь у меня есть другая программа пространства пользователя, написанная на простом C, которая пытается прослушивать все, что отправляет программа (узел) QEMU. Таким образом, я использую фрагмент, похожий на этот:
if ((fd = open("/dev/net/tun",O_RDWR)) < 0) PERROR("open");
memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = TUNMODE;
strncpy(ifr.ifr_name, "w-tap%d", IFNAMSIZ);
if (ioctl(fd, TUNSETIFF, (void *)&ifr) < 0) PERROR("ioctl");
printf("Allocated interface %s. Configure and use it\n", ifr.ifr_name);
s = socket(PF_INET, SOCK_DGRAM, 0);
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_port = htons(PORT);
if (bind(s,(struct sockaddr *)&sin, sizeof(sin)) < 0) PERROR("bind");
fromlen = sizeof(from);
while(1) {
l = recvfrom(s, buf, sizeof(buf), 0, (struct sockaddr *)&from, &fromlen);
//print the data etc
}
Теперь если я начну этот C код сказать sudo ./tun_proxy 1534
, я могу слушать сообщения на этот порт, посланного 192.168.7.2.
Далее
Я Загрузиться QEMU с дополнительной опцией -net socket,mcast=224.244.224.245:30490
поскольку запеченное изображение имеет небольшую программу, в ней, чтобы отправить несколько сообщений в эфире на группу многоадресной рассылки и порт. Кроме того, я должен уметь слушать это сообщение в предыдущем приложении tun_proxy. Я даже создал новый поток в том, что пытается прослушивать группу многоадресной рассылки, но я получаю сообщение об ошибке как «уже используемое»
Где именно мое понимание не так? Все, что мне нужно, это 2 программы пользовательского пространства, одна из которых - QEMU для связи через многоадресные сообщения.
Я попытался использовать программу shell1 как средство для прослушивания сообщений многоадресной рассылки, отправленных QEMU. QEMU был загружен с помощью одного и того же -net-сокета, mcast = 224.244.224.245: 30490. Хотя, программа shell1 возвращает ошибку: адрес уже используется. Кроме того, одно интересное различие, которое я заметил, заключается в том, что при запуске QEMU с опцией многоадресной рассылки не создается сетевого сетевого интерфейса. Хотя, когда я использую стандартную команду, например «runqemu qemux86 my-image», он создает виртуальный интерфейс. Как я могу запустить QEMU с опцией многоадресной рассылки, а также с интерфейсом виртуальной сети? – HimanshuP2
Я не думаю, что вы можете использовать параметры сокета для других типов сетей. Но вы хотели бы убедиться, что используете reuseaddr, и он находится во всех сокетах, используя порт 30490. Мой первый пример - это то, как подражать вашей текущей ситуации. – lossleader
Большое спасибо. Я смог прослушать многоадресные сообщения, используя параметр reuseaddr. – HimanshuP2