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

📄 bnproxy.c

📁 打魔兽战网的都知道他是什么
💻 C
📖 第 1 页 / 共 3 页
字号:
		currsize = virtconn_get_clientout_size(vc);		switch (net_send_packet(csocket,queue_peek_packet((t_queue const * const *)virtconn_get_clientout_queue(vc)),&currsize)) /* avoid warning */		{		case -1:		    virtconn_destroy(vc);		    continue;		    		case 0: /* still working on it */		    virtconn_set_clientout_size(vc,currsize);		    break;		    		case 1: /* done sending */		    packet = queue_pull_packet(virtconn_get_clientout_queue(vc));		    		    if (hexstrm)		    {			fprintf(hexstrm,"%d: srv class=%s[0x%04hx] type=%s[0x%04hx] length=%hu\n",				csocket,				packet_get_class_str(packet),packet_get_class(packet),				packet_get_type_str(packet,packet_dir_from_server),packet_get_type(packet),				packet_get_size(packet));			hexdump(hexstrm,packet_get_raw_data(packet,0),packet_get_size(packet));		    }		    		    packet_del_ref(packet);		    virtconn_set_clientout_size(vc,0);		}	    }	    	    eventlog(eventlog_level_debug,__FUNCTION__,"checking %d for server writeability",ssocket);	    if (ssocket!=-1 && PSOCK_FD_ISSET(ssocket,&wfds))	    {		if (virtconn_get_state(vc)==virtconn_state_connecting)		{		    int             err;		    psock_t_socklen errlen;		    		    err = 0;		    errlen = sizeof(err);		    if (psock_getsockopt(ssocket,PSOCK_SOL_SOCKET,PSOCK_SO_ERROR,&err,&errlen)<0)		    {			eventlog(eventlog_level_error,__FUNCTION__,"[%d] unable to read socket error (psock_getsockopt[psock_connect]: %s)",virtconn_get_client_socket(vc),pstrerror(psock_errno()));			virtconn_destroy(vc);			continue;		    }		    if (errlen==0 || err==0)			virtconn_set_state(vc,virtconn_state_connected);		    else		    {			eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not connect to server (psock_getsockopt[psock_connect]: %s)",virtconn_get_client_socket(vc),pstrerror(err));			virtconn_destroy(vc);			continue;		    }		}		else		{		    currsize = virtconn_get_serverout_size(vc);		    switch (net_send_packet(ssocket,queue_peek_packet((t_queue const * const *)virtconn_get_serverout_queue(vc)),&currsize)) /* avoid warning */		    {		    case -1:			virtconn_destroy(vc);			continue;					    case 0: /* still working on it */			virtconn_set_serverout_size(vc,currsize);			break;					    case 1: /* done sending */			packet = queue_pull_packet(virtconn_get_serverout_queue(vc));			packet_del_ref(packet);			virtconn_set_serverout_size(vc,0);		    }		}	    }	}	eventlog(eventlog_level_debug,__FUNCTION__,"done checking");    }        return 0;}static void usage(char const * progname){    fprintf(stderr,            "usage: %s [<options>] <servername> [<TCP portnumber>]\n"            "    -d FILE, --hexdump=FILE  do hex dump of packets into FILE\n"            "    -l FILE, --logfile=FILE  save eventlog lines into FILE\n"            "    -p PORT, --port=PORT     listen for connections on port PORT\n"#ifdef DO_DAEMONIZE            "    -f, --foreground         don't daemonize\n"#else            "    -f, --foreground         don't daemonize (default)\n"#endif            "    -h, --help, --usage      show this information and exit\n"            "    -v, --version            print version number and exit\n",            progname);    exit(STATUS_FAILURE);}extern int main(int argc, char * argv[]){    int                a;    char const *       logfile=NULL;    char const *       hexfile=NULL;    int                foreground=0;    unsigned short     port=0;    char const *       servname=NULL;    unsigned short     servport=0;    struct hostent *   host;    struct sockaddr_in servaddr;        if (argc<1 || !argv || !argv[0])    {        fprintf(stderr,"bad arguments\n");        return STATUS_FAILURE;    }        for (a=1; a<argc; a++)	if (servname && isdigit((int)argv[a][0]) && a+1>=argc)        {            if (str_to_ushort(argv[a],&servport)<0)            {                fprintf(stderr,"%s: \"%s\" should be a positive integer\n",argv[0],argv[a]);                usage(argv[0]);            }        }        else if (!servname && argv[a][0]!='-' && a+2>=argc)            servname = argv[a];	else if (strncmp(argv[a],"--hexdump=",10)==0)        {            if (hexfile)            {                fprintf(stderr,"%s: hexdump file was already specified as \"%s\"\n",argv[0],hexfile);                usage(argv[0]);            }            hexfile = &argv[a][10];        }        else if (strcmp(argv[a],"-d")==0)        {            if (a+1>=argc)            {                fprintf(stderr,"%s: option \"%s\" requires an argument\n",argv[0],argv[a]);                usage(argv[0]);            }            if (hexfile)            {                fprintf(stderr,"%s: hexdump file was already specified as \"%s\"\n",argv[0],hexfile);                usage(argv[0]);            }            a++;            hexfile = argv[a];        }        else if (strncmp(argv[a],"--logfile=",10)==0)        {            if (logfile)            {                fprintf(stderr,"%s: eventlog file was already specified as \"%s\"\n",argv[0],logfile);                usage(argv[0]);            }            logfile = &argv[a][10];        }        else if (strcmp(argv[a],"-l")==0)        {            if (a+1>=argc)            {                fprintf(stderr,"%s: option \"%s\" requires an argument\n",argv[0],argv[a]);                usage(argv[0]);            }            if (logfile)            {                fprintf(stderr,"%s: eventlog file was already specified as \"%s\"\n",argv[0],logfile);                usage(argv[0]);            }            a++;            logfile = argv[a];        }        else if (strncmp(argv[a],"--port=",7)==0)        {            if (port>0)            {                fprintf(stderr,"%s: listen port was already specified as \"%hu\"\n",argv[0],port);                usage(argv[0]);            }	    if (str_to_ushort(&argv[a][7],&port)<0)            {                fprintf(stderr,"%s: \"%s\" should be a positive integer\n",argv[0],argv[a]);                usage(argv[0]);            }        }        else if (strcmp(argv[a],"-p")==0)        {            if (a+1>=argc)            {                fprintf(stderr,"%s: option \"%s\" requires an argument\n",argv[0],argv[a]);                usage(argv[0]);            }            if (port>0)            {                fprintf(stderr,"%s: eventlog file was already specified as \"%hu\"\n",argv[0],port);                usage(argv[0]);            }            a++;	    if (str_to_ushort(argv[a],&port)<0)            {                fprintf(stderr,"%s: \"%s\" should be a positive integer\n",argv[0],argv[a]);                usage(argv[0]);            }        }        else if (strcmp(argv[a],"-f")==0 || strcmp(argv[a],"--foreground")==0)            foreground = 1;        else if (strcmp(argv[a],"-h")==0 || strcmp(argv[a],"--help")==0 || strcmp(argv[a],"--usage")==0)            usage(argv[0]);        else if (strcmp(argv[a],"-v")==0 || strcmp(argv[a],"--version")==0)        {            printf("version "PVPGN_VERSION"\n");            return STATUS_SUCCESS;        }        else if (strcmp(argv[a],"--hexdump")==0 || strcmp(argv[a],"--logfile")==0 || strcmp(argv[a],"--port")==0)        {            fprintf(stderr,"%s: option \"%s\" requires and argument.\n",argv[0],argv[a]);            usage(argv[0]);        }        else        {            fprintf(stderr,"%s: bad option \"%s\"\n",argv[0],argv[a]);            usage(argv[0]);        }        if (port==0)	port = BNETD_SERV_PORT;    if (servport==0)	servport = BNETD_SERV_PORT;    if (!servname)	servname = BNETD_DEFAULT_HOST;        if (psock_init()<0)    {	fprintf(stderr,"%s: could not initialize socket functions\n",argv[0]);	return STATUS_FAILURE;    }        if (!(host = gethostbyname(servname)))    {        fprintf(stderr,"%s: unknown host \"%s\"\n",argv[0],servname);        return STATUS_FAILURE;    }        memset(&servaddr,0,sizeof(servaddr));    servaddr.sin_family = PSOCK_AF_INET;    servaddr.sin_port   = htons(servport);    memcpy(&servaddr.sin_addr.s_addr,host->h_addr_list[0],host->h_length);        eventlog_set(stderr);    /* errors to eventlog from here on... */        if (logfile)    {	eventlog_clear_level();	eventlog_add_level("error");	eventlog_add_level("warn");	eventlog_add_level("info");	eventlog_add_level("debug");		if (eventlog_open(logfile)<0)	{	    eventlog(eventlog_level_fatal,__FUNCTION__,"could not use file \"%s\" for the eventlog (exiting)",logfile);	    return STATUS_FAILURE;	}    }    #ifdef DO_DAEMONIZE    if (!foreground)    {        if (chdir("/")<0)        {            eventlog(eventlog_level_error,__FUNCTION__,"could not change working directory to / (chdir: %s)",pstrerror(errno));            return STATUS_FAILURE;        }	        switch (fork())        {        case -1:            eventlog(eventlog_level_error,__FUNCTION__,"could not fork (fork: %s)",pstrerror(errno));            return STATUS_FAILURE;        case 0: /* child */            break;        default: /* parent */            return STATUS_SUCCESS;        }        close(STDINFD);        close(STDOUTFD);        close(STDERRFD);	# ifdef HAVE_SETPGID        if (setpgid(0,0)<0)        {            eventlog(eventlog_level_error,__FUNCTION__,"could not create new process group (setpgid: %s)",pstrerror(errno));            return STATUS_FAILURE;        }# else#  ifdef HAVE_SETPGRP#   ifdef SETPGRP_VOID        if (setpgrp()<0)        {            eventlog(eventlog_level_error,__FUNCTION__,"could not create new process group (setpgrp: %s)",pstrerror(errno));            return STATUS_FAILURE;        }#   else        if (setpgrp(0,0)<0)        {            eventlog(eventlog_level_error,__FUNCTION__,"could not create new process group (setpgrp: %s)",pstrerror(errno));            return STATUS_FAILURE;        }#   endif#  else#   ifdef HAVE_SETSID        if (setsid()<0)        {            eventlog(eventlog_level_error,__FUNCTION__,"could not create new process group (setsid: %s)",pstrerror(errno));            return STATUS_FAILURE;        }#   else#    error "One of setpgid(), setpgrp(), or setsid() is required"#   endif#  endif# endif    }#endif        if (hexfile)        if (!(hexstrm = fopen(hexfile,"w")))            eventlog(eventlog_level_error,__FUNCTION__,"could not open file \"%s\" for writing the hexdump (fopen: %s)",hexfile,pstrerror(errno));        if (proxy_process(port,servaddr)<0)    {        eventlog(eventlog_level_fatal,__FUNCTION__,"failed to initialize network (exiting)");        return STATUS_FAILURE;    }        if (hexstrm)        if (fclose(hexstrm)<0)	    eventlog(eventlog_level_error,__FUNCTION__,"could not close hexdump file \"%s\" after writing (fclose: %s)",hexfile,pstrerror(errno));        return STATUS_SUCCESS;}

⌨️ 快捷键说明

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