가상 네트워크 카드 드라이버 TUN/TAP(2)-테스트 인 스 턴 스
5068 단어 링크 ux 구동
이 가상 네트워크 카드 드라이버 를 사용 할 때 커 널 을 설정 해 야 합 니 다:Device Drivers=>Network device support=>Universal TUN/TAP device driver support
2.사례 및 분석
12 #include
13
14 int tun_create(char *dev, int flags)
15 {
16 struct ifreq ifr;
17 int fd, err;
18
19 assert(dev != NULL);
20
21 if ((fd = open("/dev/net/tun", O_RDWR)) < 0)
22 return fd;
23
24 memset(&ifr, 0, sizeof(ifr));
25 ifr.ifr_flags |= flags;
26 if (*dev != '\0')
27 strncpy(ifr.ifr_name, dev, IFNAMSIZ);
28 if ((err = ioctl(fd, TUNSETIFF, (void *)&ifr)) < 0) {
29 close(fd);
30 return err;
31 }
32 strcpy(dev, ifr.ifr_name);
33
34 return fd;
35 }
TUN/TAP 장 치 를 사용 하기 위해 서 는 특정한 헤더 파일 linux/if 를 포함해 야 합 니 다.tun.h,12 줄 과 같 습 니 다.21 줄 에서 문자 장치/dev/net/tun 을 열 었 습 니 다.다음은 ioctl 의 TUNSETIFF 명령 을 위해 구조 체 ifr 를 초기 화 해 야 합 니 다.보통 두 멤버 에 게 만 관심 을 가 져 야 합 니 다 ifrname, ifr_flags。ifr_name 은 만 들 거나 열 가상 네트워크 장치 의 이름 을 정의 합 니 다.비어 있 거나 이 네트워크 장치 가 존재 하지 않 으 면 커 널 은 가상 네트워크 장 치 를 새로 만 들 고 새로운 가상 네트워크 장치 의 이름 을 되 돌려 줍 니 다.또한 파일 설명자 fd 도 이 네트워크 설정 과 연 결 됩 니 다.네트워크 장치 의 이름 이 지정 되 지 않 으 면 커 널 은 그 유형 에 따라 tunXX 와 tapXX 를 자동 으로 선택 합 니 다.ifr_flags 는 네트워크 장치 의 일부 속성 을 설명 하 는데 사용 합 니 다.예 를 들 어 점 대 점 장치 입 니까?아니면 이 더 넷 장치 입 니까?자세 한 옵션 설명 은 다음 과 같 습 니 다.
설정 할 때 IFFTUN 과 IFFTAP 는 하 나 를 선택해 야 하고,다른 옵션 은 임의로 조합 할 수 있 습 니 다.그 중 IFFNO_PI 가 열 리 지 않 았 을 때 추 가 된 가방 정보 머리 는 다음 과 같 습 니 다.
struct tun_pi {
unsigned short flags;
unsigned short proto;
};
현재 flags 는 패 킷 을 받 을 때 만 유효 합 니 다.TUNPKT_STRIP 로고 가 설치 되 었 을 때 현재 사용자 공간 버퍼 가 너무 작 아서 패 킷 이 차단 되 었 음 을 표시 합 니 다.proto 구성원 은 패 킷 을 보 내 거나 받 는 프로 토 콜 을 표시 합 니 다.
위의 코드 에 있 는 파일 설명자 fd 는 TUN 을 지원 하 는 것 을 제외 하고SETIFF 와 다른 일반적인 ioctl 명령 외 에 다음 명령 도 지원 합 니 다.
4.567917.TUNSETNOCSUM:검사 와 검 사 를 하지 않 습 니 다.인자 가 int 형의 bool 값 입 니 다
4.567917.TUNSETOWNER:네트워크 장 치 를 설치 한 소유자.매개 변수 유형 uidt。
작은 실례
int main(int argc, char *argv[])
{
int tun, ret;
char tun_name[IFNAMSIZ];
unsigned char buf[4096];
tun_name[0] = '\0';
tun = tun_create(tun_name, IFF_TUN | IFF_NO_PI);
if (tun < 0) {
perror("tun_create");
return 1;
}
printf("TUN name is %s
", tun_name);
while (1) {
unsigned char ip[4];
ret = read(tun, buf, sizeof(buf));
if (ret < 0)
break;
memcpy(ip, &buf[12], 4);
memcpy(&buf[12], &buf[16], 4);
memcpy(&buf[16], ip, 4);
buf[20] = 0;
*((unsigned short*)&buf[22]) += 8;
printf("read %d bytes
", ret);
ret = write(tun, buf, ret);
printf("write %d bytes
", ret);
}
return 0;
}
이 코드 는 ICMP 의 ECHO 패 키 지 를 간단명료 하 게 처리 하고 ECHO REPLY 로 응답 합 니 다.
우선 이 프로그램 을 실행 합 니 다:
root@gentux test # ./a.out
TUN name is tun0
이 어 다른 터미널 에서 다음 명령 을 실행 합 니 다.
root@gentux linux-2.6.15-gentoo # ifconfig tun0 0.0.0.0 up
root@gentux linux-2.6.15-gentoo # route add 10.10.10.1 dev tun0
root@gentux linux-2.6.15-gentoo # ping 10.10.10.1
PING 10.10.10.1 (10.10.10.1) 56(84) bytes of data.
64 bytes from 10.10.10.1: icmp_seq=1 ttl=64 time=1.09 ms
64 bytes from 10.10.10.1: icmp_seq=2 ttl=64 time=5.18 ms
64 bytes from 10.10.10.1: icmp_seq=3 ttl=64 time=3.37 ms
--- 10.10.10.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2011ms
rtt min/avg/max/mdev = 1.097/3.218/5.181/1.671 ms
이 를 통 해 알 수 있 듯 이 우 리 는 응답 패 키 지 를 순조롭게 받 아 들 였 다.이때 이전 터미널 로 돌아 갔다.
read 84 bytes
write 84 bytes
read 84 bytes
write 84 bytes
read 84 bytes
write 84 bytes
모든 것 이 우리 가 예상 한 바 와 같다.
TUN/TAP 는 무엇 을 할 수 있 습 니까?
hoho,이 질문 을 하 는 것 은 좀 어 리 석 은 것 같 습 니 다.인터넷 카드 하나 로 무엇 을 할 수 있 습 니까?나 는 너 에 게 이 를 바탕 으로 하 는 두 개의 오픈 소스 프로젝트 를 알려 줄 수 있다.
vtun 과 open,다른 응용 에 대해 서 는 상상력 을 자 유 롭 게 발휘 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
u - boot 2 단계 빗질 시작\ #define DECLARE_GLOBAL_DATA_PTR register volatile gd_t * gd asm ("r8") 설명: register 를 통 해 레지스터 변 수 를 표시 하고, asm ("r8")...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.