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

📄 hosts.c

📁 sip代理服务器源码
💻 C
字号:
#include <stdio.h>#include <string.h>#include <unistd.h>#include <stdlib.h>#include "sipd.h"#define	MAX_HOST	128#define	DEBUG	if(debug==1){#define	DEND	}#define AUTH	"AUTH"struct hosts_t {	char	domain[128];	char	ip[32];	int 	port;	int	auth;	char	passwd[128];};static struct hosts_t	hosts[MAX_HOST];static struct hosts_t	defaults;static int search_table(char *domain,char *ip, int *port,int *auth,char *passwd);static int search_route(MESSAGE *domain,char *ip, int *port,int *auth,char *passwd);void InitHosts(char *fname){	FILE	*fp;	char	buff[128];	char	tag[128];	char	domain[128];	char	auth[128];	char	passwd[128];	char	ip[128];	int	n;	int	port;	int	i=0;	if(fname==NULL) {		printf("Hosts file open error \n");		exit(1);		return;	}	defaults.domain[0]='\0';	for(n=0;n<MAX_HOST;n++){			hosts[n].domain[0]='\0';			hosts[n].passwd[0]='\0';			hosts[n].port=hosts[n].auth=0;	}	fp=fopen(fname,"r");	if(fp==NULL) {		logging(4,"Hosts file open error(2)");		exit(1);		return;	}	for(i=0;fgets(buff,100,fp);){		tag[0]=domain[0]=ip[0]=auth[0]='\0';		port=0;		if(*buff=='\0'||*buff=='#'||*buff=='\n') continue;		if(strncmp(buff,"PROXY",5)!=0)continue;		n=sscanf(buff,"%s%s%s%d%s%s",tag,domain,ip,&port,auth,passwd);		if(n!=4 && n!=6) {			logging(3,"Host file format Error");			logging(3,buff);			continue;		}		if(strcmp(domain,"default")==0){			strcpy(defaults.domain,domain);			strcpy(defaults.ip,ip);			defaults.port=port;			if(strcmp(auth,AUTH)==0){				defaults.auth=YES;				strncpy(defaults.passwd,passwd,127);			}else{				defaults.auth=NO;			}		}else{			strcpy(hosts[i].domain,domain);			strcpy(hosts[i].ip,ip);			hosts[i].port=port;			if(strcmp(auth,AUTH)==0){				hosts[i].auth=YES;				strncpy(hosts[i].passwd,passwd,127);			}else{				hosts[i].auth=NO;			}DEBUG			printf("proxy %s %s %d %d\n",					hosts[i].domain,					hosts[i].ip,					hosts[i].port,					hosts[i].auth);DEND			i++;			if(i>=MAX_HOST) break;		}	}	fclose(fp);	return;}static int search_table(char *domain,char *ip, int *port,int *auth,char *passwd){	int i;	char	*ptr1;	char	*ptr2;	if(strcmp(domain,HOSTID)==0){		//极尸案でル〖ティング稍墙		logging(2,"Request URI is this server,respnded 404");		return NG;	}	for(i=0;i<MAX_HOST && hosts[i].domain[0]!='\0';i++){		if(hosts[i].domain[0]=='*'){		       	ptr1=&hosts[i].domain[1];			ptr2=strstr(domain,ptr1);			if(ptr2!=NULL && (strlen(ptr1)==strlen(ptr2))){				strcpy(ip,hosts[i].ip);				strcpy(passwd,hosts[i].passwd);				*port=hosts[i].port;				*auth=hosts[i].auth;				return OK;			}		} else{			if(strcmp(domain,hosts[i].domain)==0){				strcpy(ip,hosts[i].ip);				strcpy(passwd,hosts[i].passwd);				*port=hosts[i].port;				*auth=hosts[i].auth;				return OK;			}		}	}	if(defaults.domain[0]=='\0'){		return NG;	}	strcpy(ip,defaults.ip);	strcpy(passwd,defaults.passwd);	*port=defaults.port;	*auth=defaults.auth;	return OK;}		static int search_route(MESSAGE *mes,char *ip, int *port,int *pauth,char *ppasswd){	int ret;	URI	*ptr;	char	host[CLEN];	int	aport;	int	auth;	char	passwd[128];	//Routeヘッダのトップの案黎から、啪流黎を疯年する	//Reoutレコ〖ドの黎片を艰り叫す	ptr=mes->header.route;	mes->header.route=ptr->next;	//IPとポ〖トを藐叫する	ret=search_table(ptr->host,host,&aport,&auth,passwd);	if(ret==OK){		//ホスト叹からIPに恃垂された		strcpy(ip,host);		strcpy(ppasswd,passwd);		*port=aport;		*pauth=auth;	}else{		strcpy(ip,ptr->host);		*port=ptr->port;		*pauth=NO;	}	ret=OK;	if(*port==0) *port=SIP_PORT;	//极尸になっていたらエラ〖	if(strcmp(ip,HOSTID)==0){		//极尸案でル〖ティング稍墙		logging(2,"Request URI is this server(2),respnded 404");		free(ptr);		return NG;	}	//リクエストURIが极尸になっていたら、艰り叫したRouteレコ〖ドで惧今き	if(strcmp(mes->start.requri.host,HOSTID)==0){		memcpy(&mes->start.requri,ptr,sizeof(URI));	}		//レコ〖ドメモリエリアをフリ〖する	free(ptr);	return ret;}int SearchTransferAddress(MESSAGE *mes,char *ip, int *port,int *auth,char *passwd){	int ret;	if(mes==NULL || ip==NULL||port==NULL) {		logging(3,"Input Para Error(Search Hosts)");		return NG;	}	if(mes->header.route!=NULL){	//Route ヘッダがあれば、そこにおくる		ret=search_route(mes,ip,port,auth,passwd);	}else{	//Request URIを傅に沸烯山を浮瑚する		ret=search_table(mes->start.requri.host,ip,port,auth,passwd);	}	return ret;}

⌨️ 快捷键说明

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