VB.Net2010 下的sock5代理实现

文章转载自 【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我还真实手中无措 不过先谢谢作者分享

等待我再次调试明白在进行修改吧
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值