Здравствуйте.
Возник вопрос следующего характера. Есть домашняя сеть состоящая из роутера (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 на одном из компов, то всё отлично, другие компы получают пакет, а вот если запустить его на роутере, то никто ничего не получает.
Объясните пожалуйста, что я делаю не так?