httptunnel

// * @author Kamlesh Singh, Copyright (C) 2006, All Rights Reserved
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace HTTP_TUNNEL
{
 /// <summary>
 /// Summary description for httptunnel.
 /// </summary>
 public class httptunnel
 {
  public httptunnel()
  {
   //
   // TODO: Add constructor logic here
   //
  }

  private IPHostEntry proxyentry ;
  private IPAddress  proxyip ;
  private IPEndPoint proxyendpoint;
  public static Socket mysocket;
  
  public socket createHttpTunnel(string proxyipadd,string port,string struid,string strpwd,string destip,string destport)
  {
   proxyentry = Dns.Resolve(proxyipadd);
   proxyip = proxyentry.AddressList[0];
   int iPORT = Int32.Parse(port);
   proxyendpoint = new IPEndPoint(proxyip,iPORT);
    mysocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
   mysocket.Connect(proxyendpoint);
   string EncodedData = encodeUIDPWD(struid.ToString(),strpwd.ToString());

   string proxymsgmsg = "CONNECT " + destip +":" + destport +" HTTP/1.0\nProxy-Authorization:Basic " + EncodedData +  "\n\n" ;
   byte[] buffer = Encoding.ASCII.GetBytes(proxymsgmsg);
   byte[] buffer12 = new byte[500];
   mysocket.Send(buffer,buffer.Length,0);
   int msg = mysocket.Receive(buffer12,500,0);
   string data;
   data = Encoding.ASCII.GetString(buffer12);
   int index = data.IndexOf("200");
   
   if(index == -1)
   {
   // return 0;
   }
   else
   {
    //return 1;
    return mysocket;
   }
  }
  public string encodeUIDPWD(string uid, string pwd)
  {
   string uidpwd = uid + ":" + pwd;
   byte[] data = System.Text.UnicodeEncoding.UTF8.GetBytes(uidpwd);
   Base64Encoder myEncoder = new Base64Encoder(data);
   StringBuilder sb = new StringBuilder();
   sb.Append(myEncoder.GetEncoded());
   return (sb.ToString());

  }
 }
}



using System;

namespace HTTP_TUNNEL
{
 /// <summary>
 /// Summary description for Base64Encoder.
 /// </summary>
 public class Base64Encoder
 {
  byte[] source;
  int length,length2;
  int blockCount;
  int paddingCount;
  public Base64Encoder(byte[] input)
  {
   source=input;
   length=input.Length;
   if((length % 3)==0)
   {
    paddingCount=0;
    blockCount=length/3;
   }
   else
   {
    paddingCount=3-(length % 3);//need to add padding
    blockCount=(length+paddingCount) / 3;
   }
   length2=length+paddingCount;//or blockCount *3
  }

  public char[] GetEncoded()
  {
   byte[] source2;
   source2=new byte[length2];
   //copy data over insert padding
   for (int x=0; x<length2;x++)
   {
    if (x<length)
    {
     source2[x]=source[x];
    }
    else
    {
     source2[x]=0;
    }
   }
   
   byte b1, b2, b3;
   byte temp, temp1, temp2, temp3, temp4;
   byte[] buffer=new byte[blockCount*4];
   char[] result=new char[blockCount*4];
   for (int x=0;x<blockCount;x++)
   {
    b1=source2[x*3];
    b2=source2[x*3+1];
    b3=source2[x*3+2];

    temp1=(byte)((b1 & 252)>>2);//first

    temp=(byte)((b1 & 3)<<4);
    temp2=(byte)((b2 & 240)>>4);
    temp2+=temp; //second

    temp=(byte)((b2 & 15)<<2);
    temp3=(byte)((b3 & 192)>>6);
    temp3+=temp; //third

    temp4=(byte)(b3 & 63); //fourth

    buffer[x*4]=temp1;
    buffer[x*4+1]=temp2;
    buffer[x*4+2]=temp3;
    buffer[x*4+3]=temp4;

   }

   for (int x=0; x<blockCount*4;x++)
   {
    result[x]=sixbit2char(buffer[x]);
   }

   //covert last "A"s to "=", based on paddingCount
   switch (paddingCount)
   {
    case 0:break;
    case 1:result[blockCount*4-1]='=';break;
    case 2:result[blockCount*4-1]='=';
     result[blockCount*4-2]='=';
     break;
    default:break;
   }
   return result;
  }

  private char sixbit2char(byte b)
  {
   char[] lookupTable=new char[64]
     {
      'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
      'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
      '0','1','2','3','4','5','6','7','8','9','+','/'};

   if((b>=0) &&(b<=63))
   {
    return lookupTable[(int)b];
   }
   else
   {
    //should not happen;
    return ' ';
   }
  }
 }
}


posted on 2007-11-20 10:05  井泉  阅读(...)  评论(...编辑  收藏

导航