⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 一个简单的linux代理示例程序.txt

📁 学习(编程技巧_编程知识_程序代码),是学习编程不可多得的学习精验
💻 TXT
字号:
一个简单的linux代理示例程序
 

--------------------------------------------------------------------------------
 
第八军团 时间:2004-1-3 19:42:56 
   
By twfx


#include <stdio.h> 
#include <string.h> 
#include <errno.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <sys/time.h> 
#include <unistd.h> 
#include <netdb.h> 
#include <pthread.h> 
#include <sys/select.h>

void *thread_proc(void *arg) 
{
    char *p_begin, *p_end; 
    struct hostent hs1, *hs=&hs1; 
    struct sockaddr_in soaddrtmp; 
    char buftmp[50]; 
    int fromfd, tofd; 
    unsigned char buf[1000]; 
    fd_set rfd; 
    int number, max=0; 
    fromfd = *((int *)(arg)); 
    if((number = recv(fromfd, buf, 1000, 0)) == -1) { 
	close(fromfd);
	printf("fromfd=%d is closed now! ", fromfd); 
	return;
    }
    bzero(&soaddrtmp, sizeof(struct sockaddr_in)); 
    buf[number]=0;
    p_begin = strstr(buf, "Host: ") + 6; 
    p_end = strchr(p_begin, ' ') - 1; 
    bzero(buftmp, 50); 
    strncpy(buftmp, p_begin, p_end - p_begin); 
    printf("URL========%s", buftmp); 
    hs = gethostbyname(buftmp); 
    memcpy(&(soaddrtmp.sin_addr), hs->h_addr, hs->h_length); 
    printf("ip address=%s ", inet_ntoa(soaddrtmp.sin_addr)); 
    soaddrtmp.sin_port = htons(80); 
    soaddrtmp.sin_family = AF_INET; 
    if((tofd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { 
	fprintf(stderr, "socket(): sock_to: is error! ");
	close(fromfd);
	return;
    }
    if(connect(tofd, (struct sockaddr *)(&soaddrtmp), 
		sizeof(struct sockaddr)) == -1) { 
	fprintf(stderr, "connect(): sock_to: %s! ",
			strerror(errno));
	close(fromfd);
	return;
    }
    send(tofd, buf, number, 0); 
    if(fromfd < tofd) 
	max = tofd; 
    else
	max = fromfd; 
    while(1) { 
        bzero(buf, 1000); 
	FD_ZERO(&rfd);
	FD_SET(fromfd, &rfd); 
	FD_SET(tofd, &rfd); 
	select(max + 1, &rfd, NULL, NULL, NULL); 
	if(FD_ISSET(fromfd, &rfd)) { 
	    number = recv(fromfd, buf, 1000, 0); 
	    if((number == -1)'  '(number == 0)) { 
		close(fromfd);
		printf("fromfd=%d is closed now! ", fromfd); 
		close(tofd);
		return;
	    }
	    send(tofd, buf, number, 0); 
	}
	if(FD_ISSET(tofd, &rfd)) { 
	    number = recv(tofd, buf, 1000, 0); 
	    if((number == 0)'  '(number == -1)) { 
		close(tofd);
		printf("tofd=%d is closed now! ", tofd); 
		close(fromfd);
		return;
	    }
	    send(fromfd, buf, number, 0); 
	}
    }
    return;
}

int main() 
{
    int sock_id; 
    int id_s; 
    int length=1; 
    struct sockaddr_in s_addr; 
    pthread_t th_id; 

    if((sock_id = socket(AF_INET, SOCK_STREAM, 0)) == -1) { 
	fprintf(stderr, "socket(): is error! ");
	return 1; 
    }
    bzero(&s_addr, sizeof(struct sockaddr_in)); 
    s_addr.sin_port = htons(3128); 
    s_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
    s_addr.sin_family = AF_INET; 
    if(bind(sock_id, (struct sockaddr *)(&s_addr), 
		sizeof(struct sockaddr)) == -1) { 
	fprintf(stderr, "bind(): %s! ", strerror(errno)); 
	close(sock_id);
	return 1; 
    }if(listen(sock_id, 200) == -1) { //NOTE: attack of syn 
	fprintf(stderr, "listen(): %s! ", strerror(errno)); 
	close(sock_id);
	return 1; 
    }

    while(1) { 
	bzero(&s_addr, sizeof(struct sockaddr_in)); 
	if((id_s = accept(sock_id, (struct sockaddr *)(&s_addr), 
			&length)) == -1) { 
	    fprintf(stderr, "accept(): is error! ");
	    continue;
	}
	pthread_create(&th_id, NULL, &thread_proc, &id_s); 
//	thread_proc((void *)(&id_s)); 
//	doproxy(); 
//printf("ip=%s port=%d ", inet_ntoa(s_addr.sin_addr), ntohs(s_addr.sin_port)); 
    }
    close(sock_id);
    return 0; 
}
 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -