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

📄 rtrace.c

📁 socket5 代理服务代码 socket5 代理服务代码
💻 C
字号:
/* Copyright (c) 1996-1999 NEC USA, Inc.  All rights reserved.               *//*                                                                           *//* The redistribution, use and modification in source or binary forms of     *//* this software is subject to the conditions set forth in the copyright     *//* document ("COPYRIGHT") included with this distribution.                   */#include "socks5p.h"#include "wrap.h"#include "libproto.h"#include "protocol.h"#include "addr.h"#include "share.h"/* #define EXITERROR(err)	( perror("Traceroute"), exit((err)) ) */#define EXITERROR(err)	( exit((err)) )static int verbose   = 0;static int noname    = 0;#ifdef TROUTEPROGstatic int ischild   = 0;static void StopChild() {    int childstat;    if (ischild > 0) {	while (wait(&childstat) != ischild);    	ischild   = 0;    }}static int Popen(const char *name) {    int pds[2];    if (pipe(pds)          < 0)         return -1;    if (dup2(pds[0], STDIN_FILENO) < 0) return -1;    close(pds[0]);    if ((ischild = fork()) < 0)         return -1;        if (ischild == 0) {        close(STDIN_FILENO);        if (dup2(pds[1], STDOUT_FILENO) < 0) _exit(1);        if (dup2(pds[1], STDERR_FILENO) < 0) _exit(1);        close(pds[1]);	if (noname) execlp(TROUTEPROG, "traceroute", "-n", (verbose?"-v":name), verbose?name:NULL, NULL);	else        execlp(TROUTEPROG, "traceroute", (verbose?"-v":name), verbose?name:NULL, NULL);	        _exit(1);    }    close(pds[1]);    return ischild;}static int TraceProxy(S5NetAddr *proxy) {    int childpid, ret;        if ((childpid = Popen(lsAddr2Ascii(proxy))) < 0) return -1;    fprintf(stdout, "Traceroute to the proxy server %s\n", lsAddr2Ascii(proxy));    ret = DataRelay(STDIN_FILENO, NULL, childpid);    StopChild();    return ret;}#endif/*static void SocksTrace(S5NetAddr *dst, S5NetAddr *proxy) {    u_char flag = (noname?SOCKS5_FLAG_NONAME:0)|(verbose?SOCKS5_FLAG_VERBOSE:0);    if (InitProxy(proxy, dst, SOCKS_TRACER, flag) < 0) {        fprintf(stdout, "Fail to connect to the proxy server %s\n", lsAddr2Ascii(proxy));	EXITERROR(-1);    }    DataRelay(0);    exit(0);}*/void usage(char *progname) {    fprintf(stderr, "Usage: %s [-n] [-v] host\n", progname);    exit(-1);}int main(int argc, char *argv[]) {    char *hostname = NULL, *progname = NULL;    S5IOHandle fd;    S5NetAddr rsin;    lsSocksInfo *pcon;    struct hostent *rhp;    for (progname = *argv, argc--, argv++; argc > 0; argc--, argv++) {	if (**argv == '-') {	    if      (!strcmp(*argv, "-n")) noname  = 1;	    else if (!strcmp(*argv, "-v")) verbose = 1;	    else {		fprintf(stderr, "%s: Unrecognized option %s\n", progname, *argv);		usage(progname);	    }	} else {	    if (hostname != NULL) usage(progname);	    hostname = *argv;	}    }    if (hostname == NULL) usage(progname);    if (LIBPREFIX2(init)(NULL) != 0) EXITERROR(-1);    memset((char *)&rsin, 0, sizeof(S5NetAddr));    rsin.sin.sin_family = AF_INET;    if ((rsin.sin.sin_addr.s_addr = inet_addr(hostname)) == INVALIDADDR) {        if ((rhp = LIBPREFIX(gethostbyname)(hostname)) == NULL) EXITERROR(-1);        memcpy((char *)&rsin.sin.sin_addr.s_addr, (char *)rhp->h_addr_list[0], rhp->h_length);        rsin.sin.sin_family = rhp->h_addrtype;    }    if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == S5InvalidIOHandle) return -1;    Signal(SIGPIPE, SIG_IGN);    if ((pcon = lsLibProtoExchg(fd, &rsin, SOCKS_TRACER)) == NULL) {        fprintf(stderr, "lsLibProtoExchg: Protocol exchange failed.\n");        CLOSESOCKET(fd);        return -1;    }    if (!pcon->pri || pcon->pri->how == DIRECT || !lsAddrAddrComp(&rsin, &pcon->pri->prxyin)) {        LIBPREFIX(close)(fd);#ifndef TROUTEPROG	fprintf(stderr, "Real traceroute unavailable.\n");	exit(0);#else	if (noname) execlp(TROUTEPROG, "traceroute", "-n", (verbose?"-v":hostname), verbose?hostname:NULL, NULL);	else        execlp(TROUTEPROG, "traceroute", (verbose?"-v":hostname), verbose?hostname:NULL, NULL);	_exit(1);#endif    }#ifdef TROUTEPROG    if (TraceProxy(&pcon->pri->prxyin) < 0) {        LIBPREFIX(close)(fd);	EXITERROR(-1);    }#endif    DataRelay(fd, &pcon->pri->cinfo, 0);    LIBPREFIX(close)(fd);    exit(0);}

⌨️ 快捷键说明

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