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

📄 socket2socket.c

📁 linux 上端口映射程序源代码
💻 C
字号:
/* * socket2socket.c: Joins two sockets together * * Copyright (C) 2003 Miguelanxo Otero Salgueiro * * This program is free software; you can redistribute it and/or modify * it under the tems of the GNU General Public License version 2 as * published by the Free Software Foundation. * */#include <signal.h>#include "desproxy.h"#define MAX_CONNECTIONS 10#define PROGRAM_VERSION VERSION#define PROGRAM_NAME "socket2socket"unsigned char client_socket_is_free[MAX_CONNECTIONS];int client_socket[MAX_CONNECTIONS];int remote_socket[MAX_CONNECTIONS];voidEOC_s2s (int index){  close (client_socket[index]);  close (remote_socket[index]);  FD_CLR (client_socket[index], &mask);  FD_CLR (remote_socket[index], &mask);  client_socket_is_free[index] = 1;  printf (gettext ("End of connection\n"));  fflush (stdout);  fflush (stderr);}intmain (int argc, char **argv){  int request_socket, addrlen;  int index, count;  struct sockaddr_in server;  struct sockaddr_in remote;  struct hostent *remote_hostent;  char *remote_host;  char *remote_port;  char *local_port;  int nfound, maxfd;  struct timeval timeout;  int outfile = 1;  char *outfilename;  signal (SIGPIPE, SIG_IGN);  print_program_version (PROGRAM_NAME, PROGRAM_VERSION);  if ((argc < 4) || (argc > 5))    {      printf (gettext	      ("Usage: socket2socket remote_host remote_port local_port"	       " [logfile]\n\n"));      exit (1);    }  remote_host = argv[1];  remote_port = argv[2];  local_port = argv[3];  if (argc == 5)    {      outfilename = argv[4];      if ((outfile =	   open (outfilename, O_CREAT | O_WRONLY, S_IREAD | S_IWRITE)) == -1)	{	  perror ("open");	  exit (1);	}    }  if ((request_socket = socket (AF_INET, SOCK_STREAM, 0)) < 0)    {      perror ("socket");      exit (1);    }  memset (&server, 0, sizeof server);  server.sin_family = AF_INET;  server.sin_addr.s_addr = INADDR_ANY;  server.sin_port = htons (atoi (local_port));  if ((bind (request_socket, (struct sockaddr *) &server, sizeof server)) < 0)    {      perror ("bind");      exit (1);    }  if (listen (request_socket, SOMAXCONN) < 0)    {      perror ("listen");      exit (1);    }  printf (gettext ("Listening in port %d\n"), atoi (local_port));  printf (gettext ("Press <Control+C> to Quit\n\n"));  mark_all_client_sockets_as_free ();  FD_ZERO (&mask);  FD_SET (request_socket, &mask);  maxfd = request_socket;  while (1)    {      rmask = mask;      timeout.tv_sec = 5;      timeout.tv_usec = 0;      nfound = select (maxfd + 1, &rmask, NULL, NULL, &timeout);      if (nfound < 0)	{	  if (errno == EINTR)	    {	      printf (gettext ("Interrupted by system call\n"));	      continue;	    }	  perror ("select");	  exit (1);	}      if (FD_ISSET (request_socket, &rmask))	{	  addrlen = sizeof (remote);	  for (index = 0; index < MAX_CONNECTIONS; index++)	    if (client_socket_is_free[index])	      break;	  if (index == MAX_CONNECTIONS)	    {	      printf (gettext		      ("There are no connections available at this time\n"));	    }	  else	    {	      client_socket_is_free[index] = 0;	      client_socket[index] =		accept (request_socket, (struct sockaddr *) &remote, &addrlen);	      if (client_socket[index] < 0)		{		  perror ("accept");		  exit (1);		}	      printf (gettext ("Connection request from %s, port %d\n"),		      inet_ntoa (remote.sin_addr), ntohs (remote.sin_port));	      if (client_socket[index] > maxfd)		maxfd = client_socket[index];	      printf (gettext ("Connecting to remote host (%s:%s)\n"),		      remote_host, remote_port);	      if ((remote_socket[index] = socket (AF_INET, SOCK_STREAM, 0)) < 0)		{		  perror ("socket");		  exit (1);		}	      if (remote_socket[index] > maxfd)		maxfd = remote_socket[index];	      if ((remote_hostent = gethostbyname (remote_host)) == 0)		{		  perror ("gethostbyname");		  exit (1);		}	      memset (&remote, 0, sizeof remote);	      remote.sin_family = AF_INET;	      memcpy (&remote.sin_addr, remote_hostent->h_addr,		      remote_hostent->h_length);	      remote.sin_port = htons (atoi (remote_port));	      if (connect		  (remote_socket[index], (struct sockaddr *) &remote,		   sizeof remote) < 0)		{		  close (remote_socket[index]);		  printf ("\n");		  perror ("connect");		  exit (1);		}	      printf (gettext ("Bidirectional connection stablished\n"));	      printf ("(%s:%s) <-> (localhost)\n", remote_host, remote_port);	      FD_SET (remote_socket[index], &mask);	      FD_SET (client_socket[index], &mask);	    }	}      for (index = 0; index < MAX_CONNECTIONS; index++)	{	  if (!client_socket_is_free[index])	    {	      if (FD_ISSET (remote_socket[index], &rmask))		{		  printf ("remote -> local (connection #%d) ", index);		  fflush (stdout);		  if ((count =		       read (remote_socket[index], buffer,			     sizeof (buffer))) == -1)		    {		      perror ("read");		      EOC_s2s (index);		    }		  else		    {		      if (count == 0)			{			  EOC_s2s (index);			}		      else			{			  if ((count =			       write (client_socket[index], buffer,				      count)) == -1)			    {			      perror ("\nwrite");			      fflush (stderr);			      EOC_s2s (index);			    }			  else			    {			      if (argc == 5)				{				  write (outfile, "[R->L]", 6);				  write (outfile, buffer, count);				  fsync (outfile);				}			      printf (" %d Bytes\n", count);			      fflush (stdout);			    }			}		    }		}	    }	  if (!client_socket_is_free[index])	    {	      if (FD_ISSET (client_socket[index], &rmask))		{		  printf ("local -> remote (connection #%d)", index);		  fflush (stdout);		  if ((count =		       read (client_socket[index], buffer,			     sizeof (buffer))) == -1)		    {		      perror ("read");		      EOC_s2s (index);		    }		  else		    {		      if (count == 0)			{			  EOC_s2s (index);			}		      else			{			  if ((count =			       write (remote_socket[index], buffer,				      count)) == -1)			    {			      perror ("write");			      EOC_s2s (index);			    }			  else			    {			      if (argc == 5)				{				  write (outfile, "[L->R]", 6);				  write (outfile, buffer, count);				  fsync (outfile);				}			      printf (" %d bytes\n", count);			      fflush (stdout);			    }			}		    }		}	    }	}      fflush (stdout);      fflush (stderr);    }  exit (0);}

⌨️ 快捷键说明

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