Здравствуйте.
Вопрос является продолжением написанного здесь.
Как отправить широковещательный пакет в vpn-туннель.
Есть роутер (стоящий дома) с адресом 192.168.1.1. На нём поднят vpn-сервер, адрес 10.25.0.0, маска 255.255.255.0. На нём же крутится udp-клиент («трансивер»), который отправляет пакеты в туннель.
Так вот, если отправлять пакет например на адрес 10.25.0.6 (это подключённый смартфон), то пакет долетает, всё гуд.
А как сделать, чтоб отправлять широковещательный пакет нескольким смартфонам подключённым к vpn-серверу?
Вот код:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int nwe=1;
int sockfd;
int n;
struct sockaddr_in servaddr, cliaddr;
if(argc != 3){
printf("IP address rout, IP address tel\n");
}
if((sockfd = socket(PF_INET, SOCK_DGRAM, 0)) < 0)
{
perror(NULL);
}
setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&nwe,sizeof(nwe));
memset(&cliaddr, 0, sizeof(cliaddr));
cliaddr.sin_family = AF_INET;
cliaddr.sin_port = htons(3495);
//cliaddr.sin_addr.s_addr = htonl(INADDR_ANY);
if(inet_aton(argv[1], &cliaddr.sin_addr) == 0)
{
printf("Invalid IP address\n");
close(sockfd);
}
if(bind(sockfd, (struct sockaddr *) &cliaddr, sizeof(cliaddr)) < 0)
{
perror(NULL);
printf("Invalid bind\n");
close(sockfd);
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(3492);
if(inet_aton(argv[2], &servaddr.sin_addr) == 0)
{
printf("Invalid IP address2\n");
close(sockfd);
}
while (1)
{
usleep(910000);
char sendline[] = "paket leti)))";
if(sendto(sockfd, sendline, strlen(sendline)+1, 0, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0)
{
perror(NULL);
printf("Invalid IP sendto\n");
close(sockfd);
}
printf("bla-bla: %s\n", sendline);
}
close(sockfd);
return 0;
}
Заранее благодарю за наставления на путь истинный.