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

📄 htc.c

📁 穿越防火墙技术代码
💻 C
📖 第 1 页 / 共 2 页
字号:
  else    {      fprintf (stderr, "%s: the destination of the tunnel must be specified.\n"	               "%s: try '%s --help' for help.\n",	       arg->me, arg->me, arg->me);      exit (1);    }  if (arg->device == NULL && arg->forward_port == -1)    {      fprintf (stderr, "%s: one of --device or --forward-port must be used.\n"	               "%s: try '%s -help' for help.\n",	       arg->me, arg->me, arg->me);      exit (1);    }  if (arg->device != NULL && arg->forward_port != -1)    {      fprintf (stderr, "%s: --device can't be used together with "	                   "--forward-port.\n"	               "%s: try '%s --help' for help.\n",	       arg->me, arg->me, arg->me);    }  if (((arg->device == NULL) == (arg->forward_port == -1)) ||      arg->host_name == NULL ||      arg->host_port == -1 ||      (arg->proxy_name != NO_PROXY && arg->proxy_port == -1))    {      usage (stderr, arg->me);      exit (1);    }  if (debug_level == 0 && debug_file != NULL)    {      fprintf (stderr, "%s: --logfile can't be used without debugging\n",	       arg->me);      exit (1);    }  if (arg->proxy_name == NO_PROXY)    {      if (arg->proxy_buffer_size != NO_PROXY_BUFFER)	{	  fprintf (stderr, "%s: warning: --proxy-buffer-size can't be "		   "used without --proxy\n", arg->me);	  arg->proxy_buffer_size = NO_PROXY_BUFFER;	}      if (arg->proxy_buffer_timeout != -1)	{	  fprintf (stderr, "%s: warning: --proxy-buffer-timeout can't be "		   "used without --proxy\n", arg->me);	  arg->proxy_buffer_timeout = -1;	}      if (arg->proxy_authorization != NULL)	{	  fprintf (stderr, "%s: warning: --proxy-authorization can't be "		   "used without --proxy\n", arg->me);	  arg->proxy_authorization = NULL;	}    }  else if (arg->proxy_buffer_size == NO_PROXY_BUFFER)    arg->proxy_buffer_timeout = -1;}intmain (int argc, char **argv){  int s = -1;  int fd = -1;  Arguments arg;  Tunnel *tunnel;  int closed;  parse_arguments (argc, argv, &arg);  if (debug_level == 0 || debug_file != NULL)    daemon (0, 1);#ifdef DEBUG_MODE  if (debug_level != 0 && debug_file == NULL)    debug_file = stdout;#else  openlog ("htc", LOG_PID, LOG_DAEMON);#endif  log_notice ("htc (%s) %s started with arguments:", PACKAGE, VERSION);  log_notice ("  me = %s", arg.me);  log_notice ("  device = %s", arg.device ? arg.device : "(null)");  log_notice ("  host_name = %s", arg.host_name ? arg.host_name : "(null)");  log_notice ("  host_port = %d", arg.host_port);  log_notice ("  proxy_name = %s", arg.proxy_name ? arg.proxy_name : "(null)");  log_notice ("  proxy_port = %d", arg.proxy_port);  log_notice ("  proxy_buffer_size = %d", arg.proxy_buffer_size);  log_notice ("  proxy_buffer_timeout = %d", arg.proxy_buffer_timeout);  log_notice ("  content_length = %d", arg.content_length);  log_notice ("  forward_port = %d", arg.forward_port);  log_notice ("  max_connection_age = %d", arg.max_connection_age);  log_notice ("  strict_content_length = %d", arg.strict_content_length);  log_notice ("  keep_alive = %d", arg.keep_alive);  log_notice ("  proxy_authorization = %s",	      arg.proxy_authorization ? arg.proxy_authorization : "(null)");  log_notice ("  user_agent = %s", arg.user_agent ? arg.user_agent : "(null)");  log_notice ("  debug_level = %d", debug_level);  if (arg.forward_port != -1)    {      s = server_socket (arg.forward_port, 0);      log_debug ("server_socket (%d) = %d", arg.forward_port, s);      if (s == -1)	{	  log_error ("couldn't create server socket: %s", strerror (errno));	  log_exit (1);	}    }#ifdef DEBUG_MODE  signal (SIGPIPE, log_sigpipe);#else  signal (SIGPIPE, SIG_IGN);#endif  for (;;)    {      time_t last_tunnel_write;      if (arg.device)	{	  fd = open_device (arg.device);	  log_debug ("open_device (\"%s\") = %d", arg.device, fd);	  if (fd == -1)	    {	      log_error ("couldn't open %s: %s",			 arg.device, strerror (errno));	      log_exit (1);	    }	}      else if (arg.forward_port != -1)	{	  log_debug ("waiting for connection on port %d", arg.forward_port);	  fd = wait_for_connection_on_socket (s);	  log_debug ("wait_for_connection_on_socket (%d) = %d", s, fd);	  if (fd == -1)	    {	      log_error ("couldn't forward port %d: %s",			 arg.forward_port, strerror (errno));	      log_exit (1);	    }	}      log_debug ("creating a new tunnel");      tunnel = tunnel_new_client (arg.host_name, arg.host_port,				  arg.proxy_name, arg.proxy_port,				  arg.content_length);      if (tunnel == NULL)	{	  log_error ("couldn't create tunnel");	  log_exit (1);	}      if (tunnel_setopt (tunnel, "strict_content_length",			 &arg.strict_content_length) == -1)	log_debug ("tunnel_setopt strict_content_length error: %s",		   strerror (errno));      if (tunnel_setopt (tunnel, "keep_alive",			 &arg.keep_alive) == -1)	log_debug ("tunnel_setopt keep_alive error: %s", strerror (errno));      if (tunnel_setopt (tunnel, "max_connection_age",			 &arg.max_connection_age) == -1)	log_debug ("tunnel_setopt max_connection_age error: %s",		   strerror (errno));      if (arg.proxy_authorization != NULL)	{	  ssize_t len;	  char *auth;	  len = encode_base64 (arg.proxy_authorization,			       strlen (arg.proxy_authorization),			       &auth);	  if (len == -1)	    {	      log_error ("encode_base64 error: %s", strerror (errno));	    }	  else	    {	      char *str = malloc (len + 7);	      if (str == NULL)		{		  log_error ("out of memory when encoding "			     "authorization string");		  log_exit (1);		}	      strcpy (str, "Basic ");	      strcat (str, auth);	      free (auth);		      if (tunnel_setopt (tunnel, "proxy_authorization", str) == -1)		log_error ("tunnel_setopt proxy_authorization error: %s",			   strerror (errno));	      free (str);	    }	}      if (arg.user_agent != NULL)	{	  if (tunnel_setopt (tunnel, "user_agent", arg.user_agent) == -1)	    log_error ("tunnel_setopt user_agent error: %s",		       strerror (errno));	}      if (tunnel_connect (tunnel) == -1)	{	  log_error ("couldn't open tunnel: %s", strerror (errno));	  log_exit (1);	}      if (arg.proxy_name)	log_notice ("connected to %s:%d via %s:%d",		    arg.host_name, arg.host_port,		    arg.proxy_name, arg.proxy_port);      else	log_notice ("connected to %s%d", arg.host_name, arg.host_port);      closed = FALSE;      time (&last_tunnel_write);      while (!closed)	{	  struct pollfd pollfd[2];	  int keep_alive_timeout;	  int timeout;	  time_t t;	  int n;	  pollfd[0].fd = fd;	  pollfd[0].events = POLLIN;	  pollfd[1].fd = tunnel_pollin_fd (tunnel);	  pollfd[1].events = POLLIN;      	  time (&t);	  timeout = 1000 * (arg.keep_alive - (t - last_tunnel_write));	  keep_alive_timeout = TRUE;	  if (timeout < 0)	    timeout = 0;	  if (arg.proxy_buffer_timeout != -1 &&	      arg.proxy_buffer_timeout < timeout)	    {	      timeout = arg.proxy_buffer_timeout;	      keep_alive_timeout = FALSE;	    }	  log_annoying ("poll () ...");	  n = poll (pollfd, 2, timeout);	  log_annoying ("... = %d", n);	  if (n == -1)	    {	      log_error ("poll error: %s", strerror (errno));	      log_exit (1);	    }	  else if (n == 0)	    {	      log_verbose ("poll() timed out");	      if (keep_alive_timeout)		{		  tunnel_padding (tunnel, 1);		  time (&last_tunnel_write);		}	      else		{		  if (tunnel_maybe_pad (tunnel, arg.proxy_buffer_size) > 0)		    time (&last_tunnel_write);		}	      continue;	    }      	  handle_input ("device or port", tunnel, fd, pollfd[0].revents,			handle_device_input, &closed);	  handle_input ("tunnel", tunnel, fd, pollfd[1].revents,			handle_tunnel_input, &closed);	  if (pollfd[0].revents & POLLIN)	    time (&last_tunnel_write);	}      log_debug ("destroying tunnel");      close (fd);      tunnel_destroy (tunnel);      if (arg.proxy_name)	log_notice ("disconnected from %s:%d via %s:%d",		    arg.host_name, arg.host_port,		    arg.proxy_name, arg.proxy_port);      else	log_notice ("disconnected from %s%d", arg.host_name, arg.host_port);    }  log_debug ("closing server socket");  close (s);  log_exit (0);}

⌨️ 快捷键说明

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