LINUX.ORG.RU

UDP-клиент OpenVpn

 


0

1

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

Вопрос является продолжением написанного здесь.

Как отправить широковещательный пакет в 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;
}

Заранее благодарю за наставления на путь истинный.


openvpn в режиме «topology subnet» & «dev tap» ?

тогда проблем не должно быть.

Только под андройд поддержки tap вроде как нет :(

vel ★★★★★ ()
Последнее исправление: vel (всего исправлений: 1)
Ответ на: комментарий от stD

Перейти на мультикаст. Тем более, что для этого не понадобятся повышенные привилегии как для работы с BC. Для него есть роутеры и прокси, которые можно заставить работать с подключениями типа p-t-p/vpn

vel ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.