您的位置:首页 > 理论基础 > 计算机网络

httptunnel

2007-11-20 10:05 253 查看
// * @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 ' ';

}

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: