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

📄 conn.c

📁 一个不错的服务代理器
💻 C
字号:
char *conn_rcs = "$Id: conn.c,v 2.16 1998/10/27 02:14:07 ACJC Exp $";/* Written and copyright 1997 Anonymous Coders and Junkbusters Corporation. * Distributed under the GNU General Public License; see the README file. * This code comes with NO WARRANTY. http://www.junkbusters.com/ht/en/gpl.html */#include <stdlib.h>#include <stdio.h>#include <string.h>#include <errno.h>#include <fcntl.h>#include <sys/types.h>#ifdef _WIN32#include <windows.h>#include <sys/timeb.h>#include <io.h>#else#include <unistd.h>#include <sys/time.h>#include <netinet/in.h>#include <sys/ioctl.h>#include <netdb.h> #include <sys/socket.h>#ifndef __BEOS__#include <netinet/tcp.h>#include <arpa/inet.h>#endif#endif#ifdef REGEX#include "gnu_regex.h"#endif#include "jcc.h"intdirect_connect(struct gateway *gw, struct http_request *http, struct client_state *csp){	if(gw->forward_host) {		return(connect_to(gw->forward_host, gw->forward_port, csp));	} else {		return(connect_to(http->host, http->port, csp));	}}intatoip(char *host){	struct sockaddr_in inaddr;	struct hostent *hostp;	if ((host == NULL) || (*host == '\0')) 		return(INADDR_ANY);	memset ((char * ) &inaddr, 0, sizeof inaddr);	if ((inaddr.sin_addr.s_addr = inet_addr(host)) == -1) {		if ((hostp = gethostbyname(host)) == NULL) {			errno = EINVAL;			return(-1);		}		if (hostp->h_addrtype != AF_INET) {#ifdef _WIN32			errno = WSAEPROTOTYPE;#else			errno = EPROTOTYPE;#endif			return(-1);		}		memcpy((char * ) &inaddr.sin_addr, (char * ) hostp->h_addr,		    sizeof(inaddr.sin_addr));	}	return(inaddr.sin_addr.s_addr);}intconnect_to(char *host, int portnum, struct client_state *csp){	struct sockaddr_in inaddr;	int	fd, addr;	fd_set wfds;	struct timeval tv[1];	int	flags;	struct access_control_addr src[1], dst[1];	memset ((char * ) &inaddr, 0, sizeof inaddr);	if((addr = atoip(host)) == -1) return(-1);	src->addr = csp->ip_addr_long;	src->port = 0;	dst->addr = ntohl(addr);	dst->port = portnum;	if(block_acl(src, dst, csp)) {		errno = EPERM;		return(-1);	}	inaddr.sin_addr.s_addr = addr;	inaddr.sin_family      = AF_INET;	if (sizeof(inaddr.sin_port) == sizeof(short)) {		inaddr.sin_port = htons(portnum);	} else {		inaddr.sin_port = htonl(portnum);	}	if((fd = socket(inaddr.sin_family, SOCK_STREAM, 0)) < 0) {		return(-1);	}#ifdef TCP_NODELAY{	/* turn off TCP coalescence */	int	mi = 1;	setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (char * ) &mi, sizeof (int));}#endif#ifndef _WIN32#ifndef __BEOS__	if ((flags = fcntl(fd, F_GETFL, 0)) != -1) {		flags |= O_NDELAY;		fcntl(fd, F_SETFL, flags);	}#endif#endif	while (connect(fd, (struct sockaddr *) & inaddr, sizeof inaddr) == -1) {#ifdef _WIN32		if (errno == WSAEINPROGRESS)#else		if (errno == EINPROGRESS)#endif		{			break;		}		if (errno != EINTR) {			(void) close (fd);			return(-1);		}	}#ifndef _WIN32#ifndef __BEOS__	if (flags != -1) {		flags &= ~O_NDELAY;		fcntl(fd, F_SETFL, flags);	}#endif#endif	/* wait for connection to complete */	FD_ZERO(&wfds);	FD_SET(fd, &wfds);	tv->tv_sec  = 30;	tv->tv_usec = 0;	if (select(fd + 1, NULL, &wfds, NULL, tv) <= 0) {		(void) close(fd);		return(-1);	}	return(fd);}

⌨️ 快捷键说明

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