Постановка задачи: мне нужно выполнить примерное упражнение, чтобы достичь большей части. Для этого я должен создать 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, чтобы этот туннель мог отправлять данные в вышеописанный сокет.
ТИА