Чтение из Android VpnService Tunnel в гнездо C - PullRequest
0 голосов
/ 06 мая 2019

Постановка задачи: мне нужно выполнить примерное упражнение, чтобы достичь большей части. Для этого я должен создать C-программу, которая включает создание сокета. Эта задача сокетов состоит в том, чтобы прочитать все пакеты, поступающие от VpnService, обработать его и записать обратно в интерфейс tun, который дополнительно записывает в tun0, как показано ниже. Этот разъем C работает только на Android.

Код C-сервера показан ниже:

#include <stdio.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>

int tun_socket()
{
int sockfd, clisockfd, portno;
socklen_t clilen;
char buffer[BUFSIZ];
struct sockaddr_in serv_addr, cli_addr;
int  n;
//int optval;

/* First call to socket() function */
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) 
{
    perror("ERROR opening socket");
    return(1);
}

/* Initialize socket structure */
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = 5000;
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);

int opt_val = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt_val, sizeof opt_val);

if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
{
    perror("ERROR on binding");
    return(1);
}

listen(sockfd,5);
clilen = (socklen_t) sizeof(cli_addr);

clisockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);

if (clisockfd < 0) 
{
    perror("ERROR on accept");
    return(1);
}

bzero(buffer,BUFSIZ);

while((n = recv(clisockfd, buffer, BUFSIZ, 0)) > 0)
{
    /* If connection is established then start communicating */
    if (n < 0)
    {
        perror("ERROR reading from socket");
        return(1);
    }

    printf("Proxy: %s\n",buffer);        
    n = send(clisockfd, buffer, BUFSIZ, 0);
    bzero(buffer,BUFSIZ);

}
if (n < 0)
{
    perror("ERROR writing to socket");
    return(1);
}

close(sockfd);
return 0;
}

Java-файл службы VPN, как показано ниже, взят из LocalVpn Hexene [Localvpn service] (https://github.com/hexene/LocalVPN/blob/master/app/src/main/java/xyz/hexene/localvpn/LocalVPNService.java)

Какой код я должен добавить в службу LocalVpn, чтобы этот туннель мог отправлять данные в вышеописанный сокет. enter image description here

ТИА

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...