文章转载自 【http://blog.csdn.net/wuxing1129/article/details/4514650】
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Public Class SockProxy
Private m_RequireAuthorize As Boolean = False
Private m_user As String = String.Empty
Private m_pass As String = String.Empty
''' <summary>
''' 读取或设置代理是否需要认证
''' </summary>
''' <value>是否要认证</value>
''' <returns></returns>
''' <remarks></remarks>
Property RequireAuthorize() As Boolean
Get
Return m_RequireAuthorize
End Get
Set(ByVal value As Boolean)
m_RequireAuthorize = value
End Set
End Property
''' <summary>
''' 读取或设置代理的用户名
''' </summary>
''' <value>用户名</value>
''' <returns></returns>
''' <remarks></remarks>
Property Username() As String
Get
Return m_user
End Get
Set(ByVal value As String)
Me.m_user = value
End Set
End Property
''' <summary>
''' 读取或设置代理的密码
''' </summary>
''' <value>密码</value>
''' <returns></returns>
''' <remarks></remarks>
Property Password() As String
Get
Return Me.m_pass
End Get
Set(ByVal value As String)
Me.m_pass = value
End Set
End Property
''' <summary>
''' 连接代理
''' </summary>
''' <param name="strRemoteHost">要访问的IP</param>
''' <param name="iRemotePort">要访问的端口</param>
''' <param name="sProxyServer">代理的socket</param>
''' <returns>是否成功</returns>
''' <remarks></remarks>
Function ConnectProxyServer(ByVal strRemoteHost As String, ByVal iRemotePort As Integer, ByVal sProxyServer As Socket) As Boolean
Dim bySock5Send(9) As Byte
Dim bySock5Receive(9) As Byte
'构造Socks5代理服务器第一连接头(无用户名密码)
bySock5Send(0) = 5
bySock5Send(1) = 1
bySock5Send(2) = IIf(Me.RequireAuthorize, 2, 0)
'发送Socks5代理第一次连接信息
sProxyServer.Send(bySock5Send, 3, SocketFlags.None)
Dim iRecCount As Integer = sProxyServer.Receive(bySock5Receive, bySock5Receive.Length, SocketFlags.None)
'用户验证
If bySock5Receive(1) = 2 And Me.RequireAuthorize = False Then
Throw New Exception("代理服务器需要进行身份确认。")
ElseIf bySock5Receive(1) = 2 Then
'构造Socks5代理服务器第一连接头(无用户名密码)
Dim bUser() As Byte = Encoding.Default.GetBytes(Username)
Dim bPass() As Byte = Encoding.Default.GetBytes(Password)
Dim dl As Integer = 3 + bUser.Length + bPass.Length
ReDim bySock5Send(dl - 1)
bySock5Send(0) = 5
bySock5Send(1) = bUser.Length
Array.Copy(bUser, 0, bySock5Send, 2, bUser.Length)
bySock5Send(2 + bUser.Length) = bPass.Length
Array.Copy(bPass, 0, bySock5Send, 3 + bUser.Length, bPass.Length)
'发送Socks5代理第一次连接信息
sProxyServer.Send(bySock5Send, dl, SocketFlags.None)
ReDim bySock5Receive(100)
iRecCount = sProxyServer.Receive(bySock5Receive, bySock5Receive.Length, SocketFlags.None)
If (iRecCount < 2) Then
sProxyServer.Close()
Throw New Exception("不能获得代理服务器正确响应。")
End If
If (bySock5Receive(0) <> 5 Or (bySock5Receive(1) <> 0 And bySock5Receive(1) <> 2)) Then
sProxyServer.Close()
Throw New Exception("代理服务其返回的响应错误。")
End If
If bySock5Receive(1) = 0 Then
ReDim bySock5Send(9)
bySock5Send(0) = 5
bySock5Send(1) = 1
bySock5Send(2) = 0
bySock5Send(3) = 1
Dim ipAdd As IPAddress = Dns.GetHostAddresses(strRemoteHost)(0)
Dim strIp As String = ipAdd.ToString
Dim strAryTemp() As String = strIp.Split("."c)
bySock5Send(4) = Convert.ToByte(strAryTemp(0))
bySock5Send(5) = Convert.ToByte(strAryTemp(1))
bySock5Send(6) = Convert.ToByte(strAryTemp(2))
bySock5Send(7) = Convert.ToByte(strAryTemp(3))
bySock5Send(8) = iRemotePort / 256
bySock5Send(9) = iRemotePort Mod 256
sProxyServer.Send(bySock5Send, bySock5Send.Length, SocketFlags.None)
iRecCount = sProxyServer.Receive(bySock5Receive, bySock5Receive.Length, SocketFlags.None)
If (bySock5Receive(0) <> 5 Or bySock5Receive(1) <> 0) Then
sProxyServer.Close()
Throw New Exception("第二次连接Socks5代理返回数据出错。")
End If
Return True
Else
If (bySock5Receive(1) = 2) Then
Throw New Exception("代理服务器需要进行身份确认。")
Else
Return False
End If
End If
End If
MsgBox("成功") '我自己加的以确定代理是否成功 其实使用的时候我也不知道 具体成功没有
End Function
End Class
下面是我根据作者的C语言中的调用 自己做的以个代码使用例子
Imports System.Net
Imports System.Net.Sockets
Imports System.Net.WebClient
Imports WindowsApplication1.SockProxy
Module 代理设置函数
''' <summary>
''' 调用外部代理
''' </summary>
''' <param name="SetServerIP">代理服务器的IP</param>
''' <param name="SetServerPort">代理服务器的端口</param>
''' <remarks></remarks>
Public Sub SetSoftProxy(ByVal SetServerIP As String, ByVal SetServerPort As Integer)
' SeTServerIP远程主机IP
' SeTServerPort远程主机端口
' mySocket代理服务器控件
Dim _c As Socket
Dim _d = New SockProxy
_c = GetSocket(SetServerIP, SetServerPort)
Debug.Print(_c.Handle.ToString)
_d.ConnectProxyServer("www.svrengine.com", 80, _c)
0:
'ConnectProxyServer(SetServerIP, SetServerPort, mySocket.Connect(ServerEP))
End Sub
Public Function GetSocket(ByVal strIpAdd As String, ByVal iPort As Integer) As Socket
Dim hostadd As IPAddress, EPhost As IPEndPoint, s As Socket
hostadd = Dns.Resolve(strIpAdd).AddressList(0)
EPhost = New IPEndPoint(hostadd, iPort)
s = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
s.Connect(EPhost)
Return s
End Function
End Module
以上只是通过C语言调用 给转变为VB语言了~ 实际怎么连接 因为我也是刚刚从VB6转过来的 VB.NET2010我还真实手中无措 不过先谢谢作者分享