spproxy.pl
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:4k
源码类别:

P2P编程

开发平台:

Visual C++

  1. #!/usr/bin/perl 
  2. require 5.003;
  3. use strict;
  4. use Socket;
  5. my ($port, $protocol, $paddr, $msg, $msg2, $pid, $length, $type, $client_addr, $remote, $iaddr, $i, @socks, $socket, $welcome, $total_pkts, $PKT_INTER);
  6. $port       = 20;
  7. $protocol = getprotobyname('tcp');
  8. $PKT_INTER  = 30;
  9. sub process_sig
  10. {
  11. my $signo = shift;
  12. print ("Catch $signo.n");
  13. }
  14. sub process_hup
  15. {
  16. # open FILE, "./SP.cfg" || return;
  17. # while (<FILE>)
  18. # {
  19. # chomp;
  20. # $iaddr = inet_aton($remote) || die "no host: $remote";
  21. # $paddr = sockaddr_in($port, $iaddr);
  22. # if (!socket($socks[$total], AF_INET, SOCK_STREAM, $protocol))
  23. # {
  24. # print "socket: $!"; next;
  25. # }
  26. # if (!connect($socks[$total], $paddr))
  27. # {
  28. #  print "connect: $!"; next;
  29. # }
  30. # $total++;
  31. # }
  32. # close FILE;
  33. print "Catch SIGHUPn";
  34. }
  35. $SIG{ALRM} = &process_sig;
  36. $SIG{HUP} = &process_hup;
  37. $SIG{CHLD} = 'IGNORE';
  38. $SIG{PIPE} = 'IGNORE';
  39. $paddr = sockaddr_in ($port, INADDR_ANY);
  40. socket (SERVER, AF_INET, SOCK_STREAM, $protocol) || die "socket: $!";
  41. bind (SERVER, $paddr)
  42.      or die "bind: $!";
  43. listen (SERVER, SOMAXCONN)
  44.      or die "listen: $!";
  45. print "SERVER started on port $portn";
  46. while (1)
  47. {
  48. $client_addr = accept (CLIENT, SERVER);
  49. next if (!defined ($client_addr));
  50. ($port, $iaddr) = sockaddr_in($client_addr);
  51. print "Capture server connected from ".inet_ntoa ($iaddr).":$port.n";
  52. if (($pid = fork) == 0)
  53. {
  54. close SERVER;
  55. $port = 20;
  56. binmode CLIENT;
  57. foreach $remote (@ARGV)
  58. {
  59. $iaddr = inet_aton($remote) || die "no host: $remote";
  60. $paddr = sockaddr_in($port, $iaddr);
  61. $i++;
  62. if (!socket($socks[$i], AF_INET, SOCK_STREAM, $protocol))
  63. {
  64. print "socket: $!n"; next;
  65. }
  66. eval
  67. {
  68. alarm (5);
  69. if (!connect($socks[$i], $paddr))
  70. {
  71.  print "connect: $!n"; alarm (0); close ($socks[$i]); $socks[$i] = undef; next;
  72. }
  73. alarm (0);
  74. };
  75. setsockopt($socks[$i], SOL_SOCKET, SO_KEEPALIVE,  pack("l", 1));
  76. setsockopt($socks[$i], SOL_SOCKET, SO_LINGER, pack("II",1,0));
  77. if ($@)
  78. {
  79.   print "connect: $!n"; close $socks[$i]; next;
  80. }
  81. print "Connection succeed for $remote.n";
  82. }
  83. setsockopt(CLIENT, SOL_SOCKET, SO_KEEPALIVE,  pack("l", 1));
  84. setsockopt(CLIENT, SOL_SOCKET, SO_LINGER, pack("II",1,0))
  85. or die "Can't set SO_LINGER: $!";
  86. while (read (CLIENT, $msg, 5))
  87. {
  88. ($length, $type) = unpack ("iC", $msg);
  89. last if (
  90.    $length > 1024000
  91.    || (!defined ($i = read (CLIENT, $msg, $length - 5)))
  92.    || $i == 0
  93.     );
  94. $total_pkts++;
  95. $msg2 = pack ("iCa*", $length, $type, $msg);
  96. for ($i=0; $i<=$#ARGV; $i++)
  97. {
  98. if (!defined ($socket = $socks[$i]))
  99. {
  100. next if (($total_pkts % $PKT_INTER) != 0);
  101. $remote = $ARGV[$i];
  102. $iaddr = inet_aton($remote);
  103. $paddr = sockaddr_in($port, $iaddr);
  104. if (!socket($socket, AF_INET, SOCK_STREAM, $protocol))
  105. {
  106. print "socket: $!n"; next;
  107. }
  108. eval
  109. {
  110. alarm (5);
  111. if (!connect($socket, $paddr))
  112. {
  113.   print $ARGV[$i].": connect: $!n"; alarm (0); close ($socket); next;
  114. }
  115. alarm (0);
  116. };
  117. setsockopt($socket, SOL_SOCKET, SO_KEEPALIVE,  pack("l", 1));
  118. setsockopt($socket, SOL_SOCKET, SO_LINGER, pack("II",1,0));
  119. if ($@)
  120. {
  121.   print "connect: $!n"; close ($socket); next;
  122. }
  123. if (!defined (syswrite ($socket, $welcome)))
  124. {
  125. print "syswrite: $!n"; close ($socket); next;
  126. }
  127. $socks[$i] = $socket;
  128. }
  129. eval
  130. {
  131. alarm (5);
  132. if (!defined (syswrite ($socket, $msg2)))
  133. {
  134. print $ARGV[$i].": Here $!n";
  135. close $socket;
  136. $socks[$i] = undef;
  137. }
  138. alarm (0);
  139. };
  140. # if ($type == 0)
  141. # {
  142. # read ($socket, $msg, 9);
  143. # }
  144. }
  145. if ($type == 0)
  146. {
  147. $welcome = $msg2;
  148. $msg = pack ('iCi', 9, 100, 0);
  149. syswrite (CLIENT, $msg);
  150. }
  151. }
  152. close CLIENT;
  153. exit (0);
  154. } else
  155. {
  156. close CLIENT;
  157. }
  158. }
  159. close SERVER;