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

📄 ip-lib.c

📁 proxy源代码,linux下的ftp 代理的源代码,大家多多支持啊
💻 C
字号:
/*    File: ftpproxy/ip-lib.c    Copyright (C) 1999  Wolfgang Zekoll  <wzk@quietsche-entchen.de>    Copyright (C) 2000, 2003  Andreas Schoenberg  <asg@ftpproxy.org>      This software is free software; you can redistribute it and/or modify    it under the terms of the GNU General Public License as published by    the Free Software Foundation; either version 2 of the License, or    (at your option) any later version.      This program is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    GNU General Public License for more details.      You should have received a copy of the GNU General Public License    along with this program; if not, write to the Free Software    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include <stdlib.h>#include <stdio.h>#include <string.h>#include <ctype.h>#include <signal.h>#include <syslog.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/wait.h>#include <netinet/in.h>#include <netdb.h>#include <errno.h>#include "lib.h"#include "ip-lib.h"static void alarm_handler(){	return;}int openip(char *host, unsigned int port, char *srcip, unsigned int srcport){	int	socketd;	struct sockaddr_in server;	struct hostent *hostp, *gethostbyname();	socketd = socket(AF_INET, SOCK_STREAM, 0);	if (socketd < 0)		return (-1);    	/*	 * Enhancement to use a particular local interface and source port,	 * mentioned by Juergen Ilse, <ilse@asys-h.de>.	 */  	if (srcip != NULL  &&  *srcip != 0) {		struct sockaddr_in laddr;		if (srcport != 0) {			int	one;			one = 1;	 		setsockopt (socketd, SOL_SOCKET, SO_REUSEADDR, (int *) &one, sizeof(one));			}  		/*         	 * Bind local socket to srcport and srcip         	 */ 		memset(&laddr, 0, sizeof(laddr)); 		laddr.sin_family = AF_INET; 		laddr.sin_port   = htons(srcport); 		if (srcip == NULL  ||  *srcip == 0) 			srcip = "0.0.0.0";	/* Can't happen but who cares. */ 		else { 			struct hostent *ifp;  			ifp = gethostbyname(srcip); 			if (ifp == NULL) { 				syslog(LOG_NOTICE, "-ERR: can't lookup %s", srcip); 				exit (1); 				}  			memcpy(&laddr.sin_addr, ifp->h_addr, ifp->h_length); 	 	 	}  		if (bind(socketd, (struct sockaddr *) &laddr, sizeof(laddr))) { 			syslog(LOG_NOTICE, "-ERR: can't bind to %s:%u", srcip, ntohs(laddr.sin_port)); 	    		exit (1); 	  		}		}	server.sin_family = AF_INET;	hostp = gethostbyname(host);	if (hostp == NULL)		return (-1);  	memcpy(&server.sin_addr, hostp->h_addr, hostp->h_length);	server.sin_port = htons(port);	signal(SIGALRM, alarm_handler);	alarm(10);	if (connect(socketd, (struct sockaddr *) &server, sizeof(server)) < 0)		return (-1);	alarm(0);	signal(SIGALRM, SIG_DFL);	 	return (socketd);}	unsigned int getportnum(char *name){	unsigned int port;	struct servent *portdesc;		if (isdigit(*name) != 0)		port = atol(name);	else {		portdesc = getservbyname(name, "tcp");		if (portdesc == NULL) {			syslog(LOG_NOTICE, "-ERR: service not found: %s", name);			exit (-1);			}		port = ntohs(portdesc->s_port);		if (port == 0) {			syslog(LOG_NOTICE, "-ERR: port error: %s\n", name);			exit (-1);			}		}		return (port);}unsigned int get_port(char *server, unsigned int def_port){	unsigned int port;	char	*p;	if ((p = strchr(server, ':')) == NULL)		return (def_port);	*p++ = 0;	port = getportnum(p);	return (port);}int bind_to_port(char *interface, unsigned int port){	struct sockaddr_in saddr;	int	sock;	if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {		syslog(LOG_NOTICE, "-ERR: can't create socket: %s", strerror(errno));		exit (-1);		}	else {		int	opt;		opt = 1;		setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));		}	memset(&saddr, 0, sizeof(saddr));	saddr.sin_family = AF_INET;	saddr.sin_port   = htons(port);		if (interface == NULL  ||  *interface == 0)		interface = "0.0.0.0";	else {		struct hostent *ifp;		ifp = gethostbyname(interface);		if (ifp == NULL) {			syslog(LOG_NOTICE, "-ERR: can't lookup %s", interface);			exit (-1);			}		memcpy(&saddr.sin_addr, ifp->h_addr, ifp->h_length);		}					if (bind(sock, (struct sockaddr *) &saddr, sizeof(saddr))) {		syslog(LOG_NOTICE, "-ERR: can't bind to %s:%u", interface, port);		exit (-1);		}					if (listen(sock, 5) < 0) {		syslog(LOG_NOTICE, "-ERR: listen error:  %s", strerror(errno));		exit (-1);		}	return (sock);}

⌨️ 快捷键说明

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