@istarik_std

UDP-клиент, как отправить пакет всем?

Здравствуйте.

Возник вопрос следующего характера. Есть домашняя сеть состоящая из роутера (wl500, прошивка tomato) и трёх подключённых к нему компьютеров (линукс).

Адрес роутера 192.168.5.99, компьютеры получают адреса по dhcp (192.168.5.197, 192.168.5.224, 192.168.5.234).

На компах крутятся udp-сервера.

Что хочу

Хочу чтоб на роутере работал udp-клиент и отправлял ВСЕМ компам некий пакет (просто строка символов).

Вот сам udp-клиент:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

#define SERVERPORT "3492"    

int main(int argc, char *argv[])
{
    int sockfd;
    struct addrinfo hints, *servinfo, *p;
    int rv;
    int numbytes;
    int n=1;

    if (argc != 2) {
        exit(1);
    }

    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_UNSPEC; 
    hints.ai_socktype = SOCK_DGRAM;
    
    if ((rv = getaddrinfo(argv[1], SERVERPORT, &hints, &servinfo)) != 0) {
        fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
        return 1;
    }

    for(p = servinfo; p != NULL; p = p->ai_next) 
     {
        if((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) 
          {
            continue;
          }

        break;
     }

    setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&n,sizeof(n)); 

    if (p == NULL) {
        return 2;
    }

    char str_iz_file[128] = {0,};

    while (1) 
      {
          usleep(910000);  

          FILE *f; 
          f = fopen("/tmp/file.db", "r"); // tmp
          if(f == NULL) 
            {
              continue;
            } 

           fgets(str_iz_file, 127, f);
           fclose(f); 

           if ((numbytes = sendto(sockfd, str_iz_file, strlen(str_iz_file), 0, p->ai_addr, p->ai_addrlen)) == -1) {
           exit(1);
           }

           printf("bla-bla: %s\n", str_iz_file);
           memset(str_iz_file, 0, sizeof(str_iz_file));

      }

    freeaddrinfo(servinfo);
    close(sockfd);
    return 0;
}

//gcc -W -Wall udpclient.c -o udpclient
//  make package/udpclient/compile V=s
// ./udpclient 255.255.255.255


Запускаю вот так: ./udpclient 255.255.255.255

Вопрос заключается в том, что если запускать udpclient на одном из компов, то всё отлично, другие компы получают пакет, а вот если запустить его на роутере, то никто ничего не получает.

Объясните пожалуйста, что я делаю не так?
  • Вопрос задан
  • 454 просмотра
Пригласить эксперта
Ответы на вопрос 1
@istarik_std Автор вопроса
Собственно ответ нашёлся, надо так ./udpclient 192.168.5.255 отправлять.
Вот это можно почитать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы