亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? stfl.c

?? 實現了ipv6到ipv4的轉換(部分實現)
?? C
字號:
/* * Six To Four Layer * * Copyright 2005 Christopher Read *  * Licensed under the Apache License, Version 2.0 (the "License");  * you may not use this file except in compliance with the License.  * You may obtain a copy of the License at  *  * 		http://www.apache.org/licenses/LICENSE-2.0  *  * Unless required by applicable law or agreed to in writing, software  * distributed under the License is distributed on an "AS IS" BASIS,  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  * See the License for the specific language governing permissions and  * limitations under the License. *  * Author: Chris Read (chris.read@gmail.com) * File: stfl.c *  */#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <errno.h>#include <signal.h>#include <syslog.h>#include <pwd.h>#include <fcntl.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/time.h>#include <sys/stat.h>#include <netinet/in.h>#include <arpa/inet.h>#include <netdb.h>#include <pthread.h>#define BUFFER_SIZE 2048// Struct to pass sockets to bridge threadstruct bridge_args {	int sock1;	int sock2;};// Take 2 sockets, feed data from one to the other until one diesvoid bridge(struct bridge_args *args){ 	fd_set rfds; 	struct timeval tv; 	int retval; 	int n = 0; 	char buffer[BUFFER_SIZE]; 	int bufl; 	int sock1; 	int sock2; 	sock1 = args->sock1; 	sock2 = args->sock2; 	 	// Free this up! Just a temp memory block for holding sockets so fast spawning connections don't trample each other 	free(args);	if (sock1 > sock2)		n = sock1 + 1;	else		n = sock2 + 1; 		while (1)	{	 	FD_ZERO(&rfds);	 	FD_SET(sock1, &rfds);	 	FD_SET(sock2, &rfds);		tv.tv_sec = 1;	 	tv.tv_usec = 0;	 			retval = select(n, &rfds, NULL, NULL, &tv);				if (retval == -1)		{			printf("bridge:select:%s\n", strerror(errno));			syslog(LOG_CRIT, "bridge:select:%s", strerror(errno));			break;		}		else if (retval)		{			if (FD_ISSET(sock1, &rfds))			{					bufl = recv(sock1, buffer, BUFFER_SIZE, 0);				if (bufl < 1)					break;				send(sock2, buffer, bufl, 0);			}			if (FD_ISSET(sock2, &rfds))			{					bufl = recv(sock2, buffer, BUFFER_SIZE, 0);				if (bufl < 1)					break;				send(sock1, buffer, bufl, 0);			}		}				}			shutdown(sock1, 2);	shutdown(sock2, 2);		close(sock1);	close(sock2);}// Accept connections on socket srv, when new connection comes in, create new connection to target// and pass the 2 sockets to bridge in a forkvoid monitor(const int srv, const int srv_type, const int tgt_type, const struct sockaddr *target, socklen_t target_len){    struct sockaddr *in_addr;    struct sockaddr_in *addr4;    struct sockaddr_in6 *addr6;    socklen_t in_addr_len, base_addr_len;    in_port_t cport, sport;    int in_sock, out_sock;    pthread_t *thread;	pthread_attr_t thread_attr;    struct bridge_args *args;    char caddr[INET6_ADDRSTRLEN + 1];    char saddr[INET6_ADDRSTRLEN + 1];	pthread_attr_init(&thread_attr);		// Need to do some nasty hacks around IPv6/IPv4 structs. Would be nice if inet_ntop too a sockaddr instead...	if (srv_type == AF_INET)		base_addr_len = sizeof(struct sockaddr_in);	else		base_addr_len = sizeof(struct sockaddr_in6);			in_addr = malloc(base_addr_len);	if (tgt_type == AF_INET)	{		addr4 = (struct sockaddr_in *)target;		inet_ntop(tgt_type, (void *)&addr4->sin_addr, saddr, INET6_ADDRSTRLEN);		sport = ntohs(addr4->sin_port);	}	else	{		addr6 = (struct sockaddr_in6 *)target;		inet_ntop(tgt_type, (void *)&addr6->sin6_addr, saddr, INET6_ADDRSTRLEN);		sport = ntohs(addr6->sin6_port);	}		while (1)	{		// May not need these next two. Just being paranoid to be sure...		in_addr_len = base_addr_len;		memset(in_addr, 0, base_addr_len);	    	in_sock = accept(srv, (struct sockaddr *)in_addr, &in_addr_len);	    	    if (in_sock < 0)	    {	    	syslog(LOG_ERR, "monitor:accept:%s", strerror(errno));		printf("monitor:accept:%s\n", strerror(errno));		exit(-1);	    }	    		    // Grab address details of client we're serving	    if (srv_type == AF_INET)	    {		    addr4 = (struct sockaddr_in *)in_addr;        	inet_ntop(srv_type, (void *)&addr4->sin_addr, caddr, INET6_ADDRSTRLEN);        	cport = ntohs(addr4->sin_port);	    }        else        {		    addr6 = (struct sockaddr_in6 *)in_addr;        	inet_ntop(srv_type, (void *)&addr6->sin6_addr, caddr, INET6_ADDRSTRLEN);        	cport = ntohs(addr6->sin6_port);        }    		out_sock = socket(tgt_type, SOCK_STREAM, 0);		    if (connect(out_sock, target, target_len) != 0)	    {	    	printf("monitor:connect:%s connecting to %s:%u\n", strerror(errno), saddr, sport);	    	syslog(LOG_ERR, "monitor:connect:%s connecting to %s:%u", strerror(errno), saddr, sport);	    	shutdown(in_sock, 2);	    	close(in_sock);	    }	    else	    {		    printf("Connecting %s:%u to %s:%u\n", caddr, cport, saddr, sport);		    syslog(LOG_NOTICE, "Connecting %s:%u to %s:%u", caddr, cport, saddr, sport);				// Need a temp struct to pass sockets over to thread on. Freed up early in the bridge...	    			args = malloc(sizeof(struct bridge_args));			args->sock1 = in_sock;			args->sock2 = out_sock;						thread = malloc(sizeof(pthread_t));			// Fire and forget the thread...			pthread_create(thread, &thread_attr, (void *)bridge, args);			free(thread);	    }	}		pthread_attr_destroy(&thread_attr);	free(in_addr);}// The main event. Params are passed on the command line.int main(int argc, char *argv[]){	int srv;	int error;	int opt;	char *bind_ip = "";	char *bind_port = "";	char *target_ip = "";	char *target_port = "";	char *user = "";	uid_t uid;	struct passwd *pwinfo;	int foreground = 0;	int f;	struct addrinfo hints, *srv_info, *tgt_info;		printf("Six To Four Layer\n");		if (argc < 5)	{		printf("Usage: %s -l <listen ip> -p <listen port> -t <target ip> -d <target port> [-u <uid>] [-f]\n", argv[0]);		printf("\t-u: User ID to run as once bound to listening port. Can be name or number\n");		printf("\t-f: Run in the foreground. Usefull if you want to test or debug\n");		return 0;	}		while ((opt = getopt(argc, argv, "l:p:t:d:u:f")) != EOF)	{		switch (opt)		{			case 'l':				bind_ip = optarg;				break;			case 'p':				bind_port = optarg;				break;			case 't':				target_ip = optarg;				break;			case 'd':				target_port = optarg;				break;			case 'u':				user = optarg;				break;			case 'f':				foreground = 1;				break;		}	}		if ((bind_ip == "") || (bind_port == "") || (target_ip == "") || (target_port == ""))	{		printf("Missing parameters!\n");		exit(-1);	}	if (strlen(user) > 20)	{		printf("UID is too long. Must be unix name or uid.\n");		exit(-1);	}	if (foreground == 0)	{		f = fork();		if (f < 0) 			exit(1); 		if (f > 0) 			exit(0); /* parent exits */		/* child (daemon) continues */		setsid(); /* obtain a new process group */		for (f = getdtablesize(); f >= 0; --f) 			close(f); /* close all descriptors */		f = open("/dev/null", O_RDWR); 		dup(f); 		dup(f); /* handle standard I/O because we just closed all descriptors */	}		openlog("stfl", LOG_PID, LOG_DAEMON);			printf("Bridging connections on [%s]:%s to [%s]:%s\n", bind_ip, bind_port, target_ip, target_port);	syslog(LOG_NOTICE, "Bridging connections on [%s]:%s to [%s]:%s\n", bind_ip, bind_port, target_ip, target_port);		memset(&hints, 0, sizeof(hints));	hints.ai_family = PF_UNSPEC;	hints.ai_socktype = SOCK_STREAM;		// Get server socket info	error = getaddrinfo(bind_ip, bind_port, &hints, &srv_info);	if (error)	{		syslog(LOG_CRIT, "%s", gai_strerror(error));		printf("%s\n", gai_strerror(error));		exit(-1);	}		// Get target socket info	error = getaddrinfo(target_ip, target_port, &hints, &tgt_info);	if (error)	{		syslog(LOG_CRIT, "%s", gai_strerror(error));		printf("%s\n", gai_strerror(error));		exit(-1);	}		srv = socket(srv_info->ai_family, srv_info->ai_socktype, srv_info->ai_protocol);	if (srv < 0)	{		syslog(LOG_CRIT, "main:socket:%s", strerror(errno));		printf("main:socket:%s\n", strerror(errno));		exit(-1);	}			bind(srv, srv_info->ai_addr, srv_info->ai_addrlen);	if (error < 0)	{		syslog(LOG_CRIT, "main:bind:%s", strerror(errno));		printf("main:bind:%s\n", strerror(errno));		exit(-1);	}			// Check if we need to give up root now...	if (strcmp(user, "") != 0)	{		if (getuid() != 0)		{			syslog(LOG_ERR, "main:uid:%s", "Cannot change user when not root, continuing as current user");			printf("main:uid:%s\n", "Cannot change user when not root, continuing as current user");		}		else		{			uid = strtol(user, (char **)NULL, 10);			if ((uid == LONG_MIN) || (uid == LONG_MAX) || (uid == 0))			{				pwinfo = getpwnam(user);				if (pwinfo == NULL)				{					syslog(LOG_CRIT, "main:uid:%s is not a valid user on this system", user);					printf("main:uid:%s is not a valid user on this system\n", user);					exit(-1);				}				uid = pwinfo->pw_uid;			}						if (setuid(uid) != 0)			{				syslog(LOG_CRIT, "main:uid:Unable to change to uid %s", user);				printf("main:uid:Unable to change to uid %s\n", user);				exit(-1);			}			printf("Switched to user %s\n", user);		}	}		listen(srv, 5);	monitor(srv, srv_info->ai_family, tgt_info->ai_family, tgt_info->ai_addr, tgt_info->ai_addrlen);		printf("Shutting down...\n");	syslog(LOG_NOTICE, "Shutting down...\n");		close(srv);		freeaddrinfo(srv_info);	freeaddrinfo(tgt_info); 	 	return 0;	}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品久久久三级丝袜| 制服.丝袜.亚洲.中文.综合| 久久精品99国产国产精| 亚洲综合视频网| 国产精品免费免费| 国产精品午夜电影| 久久综合色之久久综合| 精品国产一区久久| 久久久久久97三级| 国产欧美一区二区三区网站| 久久一留热品黄| 国产日韩精品一区二区三区在线| 国产情人综合久久777777| 久久综合久久99| 国产精品福利av| 亚洲宅男天堂在线观看无病毒| 亚洲精品美腿丝袜| 午夜精品视频在线观看| 免费不卡在线观看| 懂色av一区二区三区免费观看| 成人国产一区二区三区精品| 色嗨嗨av一区二区三区| 欧美精品乱码久久久久久| 欧美xxxxx裸体时装秀| 欧美激情一区二区三区在线| 亚洲视频一二三区| 五月天欧美精品| 国产一区 二区| 91视视频在线观看入口直接观看www| 91啪亚洲精品| 日韩欧美黄色影院| 日本一区二区动态图| 夜夜嗨av一区二区三区中文字幕| 天堂在线亚洲视频| 国产盗摄精品一区二区三区在线 | 美腿丝袜一区二区三区| 国产在线精品不卡| 91蜜桃传媒精品久久久一区二区| 欧美丰满美乳xxx高潮www| 久久精品亚洲精品国产欧美 | 日本伊人色综合网| 成人av午夜电影| 欧美国产日韩a欧美在线观看 | 国产真实乱对白精彩久久| 91原创在线视频| 久久一区二区视频| 亚洲电影视频在线| 成人动漫在线一区| 久久免费偷拍视频| 婷婷丁香激情综合| 色婷婷av一区二区三区软件| 亚洲精品一区二区三区99| 亚洲五码中文字幕| 国产精品一二三| 日韩欧美色综合| 亚洲成va人在线观看| 成人免费高清在线| 欧美精品一区二区精品网| 午夜精品一区二区三区免费视频 | 丝袜美腿亚洲色图| 91网址在线看| 国产日本欧洲亚洲| 精品无人码麻豆乱码1区2区| 欧美巨大另类极品videosbest| 成人免费小视频| 国产成a人亚洲| 久久一区二区视频| 黄色日韩三级电影| 欧美精品久久一区二区三区| 一区二区三区在线观看国产| 成人免费精品视频| 国产精品久久久久毛片软件| 国产aⅴ精品一区二区三区色成熟| 日韩美女在线视频| 亚洲一区二区美女| 欧美美女一区二区| 日日夜夜精品视频免费| 欧美日韩中文字幕一区二区| 亚洲一区二区三区免费视频| 精品视频一区二区不卡| 亚洲成人动漫精品| 欧美日韩aaaaa| 亚洲国产精品影院| 91免费观看国产| 亚洲品质自拍视频| 在线看日本不卡| 亚洲国产aⅴ成人精品无吗| 欧美三级电影精品| 天天色综合成人网| 精品免费一区二区三区| 国产风韵犹存在线视精品| 中文字幕一区二区三区四区不卡| 91偷拍与自偷拍精品| 午夜激情综合网| 日韩欧美国产小视频| 国产一区二区三区免费播放| 国产精品久久三区| 欧美在线制服丝袜| 久久99热狠狠色一区二区| 久久久99免费| 色婷婷亚洲综合| 天堂在线一区二区| 国产日本欧美一区二区| 色综合天天视频在线观看| 日韩精品成人一区二区在线| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 欧美日韩一区国产| 久99久精品视频免费观看| 国产亚洲成av人在线观看导航| 色综合久久综合网97色综合| 日韩不卡一区二区| 国产精品久久久一本精品| 在线观看三级视频欧美| 九九精品一区二区| 亚洲欧美日韩国产手机在线 | 精品一区二区精品| 亚洲欧洲色图综合| 日韩一区二区三区观看| 99久久精品国产一区二区三区| 午夜精品久久久| 国产精品美日韩| 欧美一卡二卡在线| 91小宝寻花一区二区三区| 美女视频第一区二区三区免费观看网站| 欧美国产禁国产网站cc| 7777精品久久久大香线蕉| 成人一道本在线| 日本va欧美va瓶| 亚洲精品国产高清久久伦理二区| 久久综合九色综合97婷婷女人 | 蜜臀91精品一区二区三区| 国产精品视频你懂的| 日韩欧美高清一区| 欧美性欧美巨大黑白大战| 国产91在线观看丝袜| 日日夜夜免费精品视频| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 欧美一激情一区二区三区| 精品国精品自拍自在线| 在线影院国内精品| 99精品欧美一区二区三区小说 | 91在线丨porny丨国产| 国产精品影视天天线| 久久国产视频网| 日本aⅴ免费视频一区二区三区 | 日本va欧美va瓶| 日韩精品亚洲一区| 亚洲亚洲精品在线观看| 悠悠色在线精品| 亚洲特黄一级片| 最新不卡av在线| 亚洲国产精品av| 国产欧美一区二区精品性色超碰| 精品99一区二区三区| 亚洲精品一区二区三区在线观看| 日韩你懂的电影在线观看| 日韩免费在线观看| 精品久久一二三区| 欧美电影精品一区二区| 精品免费视频一区二区| 337p日本欧洲亚洲大胆精品| 精品久久久久久最新网址| 久久综合给合久久狠狠狠97色69| 精品国产亚洲一区二区三区在线观看| 欧美高清激情brazzers| 日韩一区二区中文字幕| 日韩久久精品一区| 久久久精品国产99久久精品芒果| 国产视频911| 亚洲欧美怡红院| 有码一区二区三区| 午夜精品久久久久久久久久久| 日韩av在线播放中文字幕| 美女高潮久久久| 国产91精品一区二区| 91在线观看下载| 欧美精品18+| 久久久久亚洲综合| 日韩毛片视频在线看| 亚洲免费观看在线视频| 强制捆绑调教一区二区| 国产精品一二二区| 91免费精品国自产拍在线不卡| 欧美日韩性生活| 久久综合av免费| 亚洲六月丁香色婷婷综合久久| 丝袜a∨在线一区二区三区不卡 | 国产日韩影视精品| 亚洲精品水蜜桃| 日韩va亚洲va欧美va久久| 国产一区二区三区在线观看免费 | 91精品国产丝袜白色高跟鞋| 国产欧美一区二区三区鸳鸯浴| 一区二区三区四区蜜桃| 精品一区二区免费| 91在线视频播放| 26uuu久久综合| 亚洲自拍与偷拍| eeuss鲁片一区二区三区| 欧美一级高清大全免费观看|