简单实现Http代理工具--端口复用与QQ代理
2012-03-09 00:00
323 查看
话说上一次做完http代理工具后,没有测试QQ代理,回家试了一下,做了一下简单补充,并测试通过。
上次的文章提到,所有公司的服务器端口都封了,只剩下几个通讯的已经正在便用的。
于是,在本地XP下试了一下端口劫持,也称端口复用。抢占80端口。
关键代码就一句:tcplistener.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
在本地实现抢占80端口后,所有的http请求本地iis的,就出现访问不了的情况,所以我又实现了给IIS中转请求
即收到消息后,分析是否IIS请求,如果是,则转发请求到IIS,其它的就转发给相应其它的网站。
由于转发给本机的IIS请求速度过快,这时候需要适当延时,不然问题又出来了。
端口复用在win2003下是不支持的,我也没办法。
但是可通过不同IP监听同一端口如:192.168.1.48 8000 和192.168.1.49 8000(此时需要为主机分配多个IP)
接下来继续上代码,并提供代码下载:
Proxy.cs
Proxy代理类
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Diagnostics;
using
System.Net.Sockets;
using
System.Threading;
namespace
TcpProxy
{
///
<summary>
///
by 路过秋天
///
http://www.cnblogs.com/cyq1162
///
</summary>
class
Program
{
static
void
Main(
string
[] args)
{
Listen(
80
);
}
static
void
Write(
string
msg)
{
Console.WriteLine(msg);
}
static
void
Listen(
int
port)
{
Write(
"
准备监听端口:
"
+
port);
System.Net.IPAddress[] ips
=
System.Net.Dns.GetHostAddresses(System.Net.Dns.GetHostName());
foreach
(System.Net.IPAddress ip
in
ips)
{
Write(ip.ToString());
}
System.Net.IPAddress ipp
=
System.Net.IPAddress.Parse(
"
0.0.0.0
"
);
TcpListener tcplistener
=
new
TcpListener(ipp,port);
//
tcplistener.ExclusiveAddressUse = false;
tcplistener.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress,
true
);
//
tcplistener.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.,ProtocolType.IP);
try
{
tcplistener.Start();
}
catch
(Exception err)
{
Write(err.Message);
Write(
"
该端口已被占用,请更换端口号!!!
"
);
ReListen(tcplistener);
}
Write(
"
确认:y/n (yes or no):
"
);
string
isOK
=
Console.ReadLine();
if
(isOK
==
"
y
"
)
{
Write(
"
成功监听端口:
"
+
port);
//
侦听端口号
Socket socket;
while
(
true
)
{
socket
=
tcplistener.AcceptSocket();
//
并获取传送和接收数据的Scoket实例
Proxy proxy
=
new
Proxy(socket);
//
Proxy类实例化
Thread thread
=
new
Thread(
new
ThreadStart(proxy.Run));
//
创建线程
thread.Start();
System.Threading.Thread.Sleep(
200
);
//
启动线程
}
}
else
{
ReListen(tcplistener);
}
}
static
void
ReListen(TcpListener listener)
{
if
(listener
!=
null
)
{
listener.Stop();
listener
=
null
;
}
Write(
"
请输入监听端口号:
"
);
string
newPort
=
Console.ReadLine();
int
port;
if
(
int
.TryParse(newPort,
out
port))
{
Listen(port);
}
else
{
ReListen(listener);
}
}
}
}
Program.cs
Main函数入口
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Diagnostics;
using
System.Net.Sockets;
using
System.Threading;
namespace
TcpProxy
{
///
<summary>
///
by 路过秋天
///
http://www.cnblogs.com/cyq1162
///
</summary>
class
Program
{
static
void
Main(
string
[] args)
{
Listen(
80
);
}
static
void
Write(
string
msg)
{
Console.WriteLine(msg);
}
static
void
Listen(
int
port)
{
Write(
"
准备监听端口:
"
+
port);
System.Net.IPAddress[] ips
=
System.Net.Dns.GetHostAddresses(System.Net.Dns.GetHostName());
foreach
(System.Net.IPAddress ip
in
ips)
{
Write(ip.ToString());
}
System.Net.IPAddress ipp
=
System.Net.IPAddress.Parse(
"
0.0.0.0
"
);
TcpListener tcplistener
=
new
TcpListener(ipp,port);
//
tcplistener.ExclusiveAddressUse = false;
tcplistener.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress,
true
);
//
tcplistener.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.,ProtocolType.IP);
try
{
tcplistener.Start();
}
catch
(Exception err)
{
Write(err.Message);
Write(
"
该端口已被占用,请更换端口号!!!
"
);
ReListen(tcplistener);
}
Write(
"
确认:y/n (yes or no):
"
);
string
isOK
=
Console.ReadLine();
if
(isOK
==
"
y
"
)
{
Write(
"
成功监听端口:
"
+
port);
//
侦听端口号
Socket socket;
while
(
true
)
{
socket
=
tcplistener.AcceptSocket();
//
并获取传送和接收数据的Scoket实例
Proxy proxy
=
new
Proxy(socket);
//
Proxy类实例化
Thread thread
=
new
Thread(
new
ThreadStart(proxy.Run));
//
创建线程
thread.Start();
System.Threading.Thread.Sleep(
200
);
//
启动线程
}
}
else
{
ReListen(tcplistener);
}
}
static
void
ReListen(TcpListener listener)
{
if
(listener
!=
null
)
{
listener.Stop();
listener
=
null
;
}
Write(
"
请输入监听端口号:
"
);
string
newPort
=
Console.ReadLine();
int
port;
if
(
int
.TryParse(newPort,
out
port))
{
Listen(port);
}
else
{
ReListen(listener);
}
}
}
}
OK,打完收下。
点击此处下载代码
原文链接:
http://www.cnblogs.com/cyq1162/archive/2010/06/07/1753503.html
上次的文章提到,所有公司的服务器端口都封了,只剩下几个通讯的已经正在便用的。
于是,在本地XP下试了一下端口劫持,也称端口复用。抢占80端口。
关键代码就一句:tcplistener.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
在本地实现抢占80端口后,所有的http请求本地iis的,就出现访问不了的情况,所以我又实现了给IIS中转请求
即收到消息后,分析是否IIS请求,如果是,则转发请求到IIS,其它的就转发给相应其它的网站。
由于转发给本机的IIS请求速度过快,这时候需要适当延时,不然问题又出来了。
端口复用在win2003下是不支持的,我也没办法。
但是可通过不同IP监听同一端口如:192.168.1.48 8000 和192.168.1.49 8000(此时需要为主机分配多个IP)
接下来继续上代码,并提供代码下载:
Proxy.cs
Proxy代理类
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Diagnostics;
using
System.Net.Sockets;
using
System.Threading;
namespace
TcpProxy
{
///
<summary>
///
by 路过秋天
///
http://www.cnblogs.com/cyq1162
///
</summary>
class
Program
{
static
void
Main(
string
[] args)
{
Listen(
80
);
}
static
void
Write(
string
msg)
{
Console.WriteLine(msg);
}
static
void
Listen(
int
port)
{
Write(
"
准备监听端口:
"
+
port);
System.Net.IPAddress[] ips
=
System.Net.Dns.GetHostAddresses(System.Net.Dns.GetHostName());
foreach
(System.Net.IPAddress ip
in
ips)
{
Write(ip.ToString());
}
System.Net.IPAddress ipp
=
System.Net.IPAddress.Parse(
"
0.0.0.0
"
);
TcpListener tcplistener
=
new
TcpListener(ipp,port);
//
tcplistener.ExclusiveAddressUse = false;
tcplistener.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress,
true
);
//
tcplistener.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.,ProtocolType.IP);
try
{
tcplistener.Start();
}
catch
(Exception err)
{
Write(err.Message);
Write(
"
该端口已被占用,请更换端口号!!!
"
);
ReListen(tcplistener);
}
Write(
"
确认:y/n (yes or no):
"
);
string
isOK
=
Console.ReadLine();
if
(isOK
==
"
y
"
)
{
Write(
"
成功监听端口:
"
+
port);
//
侦听端口号
Socket socket;
while
(
true
)
{
socket
=
tcplistener.AcceptSocket();
//
并获取传送和接收数据的Scoket实例
Proxy proxy
=
new
Proxy(socket);
//
Proxy类实例化
Thread thread
=
new
Thread(
new
ThreadStart(proxy.Run));
//
创建线程
thread.Start();
System.Threading.Thread.Sleep(
200
);
//
启动线程
}
}
else
{
ReListen(tcplistener);
}
}
static
void
ReListen(TcpListener listener)
{
if
(listener
!=
null
)
{
listener.Stop();
listener
=
null
;
}
Write(
"
请输入监听端口号:
"
);
string
newPort
=
Console.ReadLine();
int
port;
if
(
int
.TryParse(newPort,
out
port))
{
Listen(port);
}
else
{
ReListen(listener);
}
}
}
}
Program.cs
Main函数入口
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Diagnostics;
using
System.Net.Sockets;
using
System.Threading;
namespace
TcpProxy
{
///
<summary>
///
by 路过秋天
///
http://www.cnblogs.com/cyq1162
///
</summary>
class
Program
{
static
void
Main(
string
[] args)
{
Listen(
80
);
}
static
void
Write(
string
msg)
{
Console.WriteLine(msg);
}
static
void
Listen(
int
port)
{
Write(
"
准备监听端口:
"
+
port);
System.Net.IPAddress[] ips
=
System.Net.Dns.GetHostAddresses(System.Net.Dns.GetHostName());
foreach
(System.Net.IPAddress ip
in
ips)
{
Write(ip.ToString());
}
System.Net.IPAddress ipp
=
System.Net.IPAddress.Parse(
"
0.0.0.0
"
);
TcpListener tcplistener
=
new
TcpListener(ipp,port);
//
tcplistener.ExclusiveAddressUse = false;
tcplistener.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress,
true
);
//
tcplistener.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.,ProtocolType.IP);
try
{
tcplistener.Start();
}
catch
(Exception err)
{
Write(err.Message);
Write(
"
该端口已被占用,请更换端口号!!!
"
);
ReListen(tcplistener);
}
Write(
"
确认:y/n (yes or no):
"
);
string
isOK
=
Console.ReadLine();
if
(isOK
==
"
y
"
)
{
Write(
"
成功监听端口:
"
+
port);
//
侦听端口号
Socket socket;
while
(
true
)
{
socket
=
tcplistener.AcceptSocket();
//
并获取传送和接收数据的Scoket实例
Proxy proxy
=
new
Proxy(socket);
//
Proxy类实例化
Thread thread
=
new
Thread(
new
ThreadStart(proxy.Run));
//
创建线程
thread.Start();
System.Threading.Thread.Sleep(
200
);
//
启动线程
}
}
else
{
ReListen(tcplistener);
}
}
static
void
ReListen(TcpListener listener)
{
if
(listener
!=
null
)
{
listener.Stop();
listener
=
null
;
}
Write(
"
请输入监听端口号:
"
);
string
newPort
=
Console.ReadLine();
int
port;
if
(
int
.TryParse(newPort,
out
port))
{
Listen(port);
}
else
{
ReListen(listener);
}
}
}
}
OK,打完收下。
点击此处下载代码
原文链接:
http://www.cnblogs.com/cyq1162/archive/2010/06/07/1753503.html
相关文章推荐
- 简单实现Http代理工具--端口复用与QQ代理
- 简单实现Http代理工具--端口复用与QQ代理
- 简单实现Http代理工具--端口复用与QQ代理
- 简单实现Http代理工具--完善支持QQ代理
- 简单实现Http代理工具--完善支持QQ代理
- 简单实现Http代理工具--完善支持QQ代理
- 简单实现Http代理工具--完善支持QQ代理
- 简单实现Http代理工具
- 简单实现Http代理工具
- 简单实现Http代理工具
- 简单实现Http代理工具
- 简单实现Http代理工具(转)
- go实现简单的反向代理工具
- Http 代理工具 实战 支持网页与QQ代理
- Http 代理工具 实战 支持网页与QQ代理
- 使用erlang实现简单的http性能测试工具,替代loadrunner、loadspace
- nodejs 实现简单 http 代理并缓存
- 简单HTTP服务器的Java实现
- [工具类]HttpClientUtil简单工具
- 基于HTTP长轮询实现简单推送