2003. 10. 22. 14:33

IP형식 알아보는 모듈

Public Function IsStrIP(strIp As String) As Boolean
'문법에 맞는 아이피냐? 아니냐?
'000.000.000.000, 127.0.0.1
'각 숫자는 무조건 0보다 크고 255보다 작아야 한다. 단, 로컬 아이피인 127.0.0.1의 경우 가운데 숫자들이 0이므로
'이것을 처리할 수 있어야 한다.
    Dim SplitIP() As String
    Dim i As Byte
    
    '최대 자릿수인 15자리수가 넘어갔을 경우와 최소 자릿수인 7자리수가 안될 경우
    If Len(strIp) > 15 Or Len(strIp) < 7 Then GoTo msgerr
    '-------------- 1처리 -----------------
    SplitIP = Split(strIp, ".")
    '--------------------------------------
    'dot(점으)로 나눈 숫자들이 3(=4)과 같지 않으면 아이피가 아닌것으로 판정함.
    If UBound(SplitIP) <> 3 Then GoTo msgerr

    '나눈 문자열들 중 255보다 크거나 0보다 작을 때 및 빈문자열일 경우 아이피 아님판정
    For i = 0 To UBound(SplitIP) '딱 4개로 떨어지지만 확실하게 하기 위해 Ubound사용
        If val(SplitIP(i)) > &HFF Or val(SplitIP(i)) < 0 Or SplitIP(i) = "" Then
            If (i = 1 Or i = 2) And val(SplitIP(i)) = 0 Then '가운데 숫자는 넘기기
            Else
                GoTo msgerr
            End If
        End If
    Next
    IsStrIP = True
    Exit Function
msgerr:
    IsStrIP = False
End Function






Public Function GetNonzeroIpAddress(IpStr As String) As String

'아래는 화면디스플레이할 때 자릿수에 맞춰 보기 좋게 하기 위해서 무조건 3자리로 표시합니다.

'예를 들어 192.168.004.188 이런식으로 화면 디스플레이 합니다.

'그런데 이런 상태로 통신하면 안되죠. 이것을 다시 192.168.4.188로 만들기 위한 함수입니다.

    Dim pos As Integer

    Dim temp_ipstr As String

    Dim IPaddr(4) As String

    Dim I As Integer

     temp_ipstr = IpStr

    

    For I = 1 To 4

        pos = InStr(temp_ipstr, ".")

        If pos < 0 Then

            GetNonzeroIpAddress = ""

            Exit Function

        ElseIf pos = 0 Then

            IPaddr(I) = temp_ipstr

            temp_ipstr = ""

        Else

            IPaddr(I) = Left(temp_ipstr, pos - 1)

            temp_ipstr = Mid(temp_ipstr, pos + 1)

        End If

        

        While Left(IPaddr(I), 1) = "0"

            IPaddr(I) = Mid(IPaddr(I), 2)

        Wend

    Next

    GetNonzeroIpAddress = IPaddr(1) & "." & IPaddr(2) & "." & IPaddr(3) & "." & IPaddr(4)

End Function






Public Function GetPushZeroIP(IpStr As String) As String

'아래 함수는 위의 함수가 하는일의 반대일을 합니다. 화면 디스플레이를 보기 좋게 하기 위해

'세자리 씩 끊어주는 함수죠

    Dim IPaddr() As String, I As Byte

    IPaddr() = Split(IpStr, ".")

    For I = 0 To UBound(IPaddr)

        IPaddr(I) = Format(IPaddr(I), "000")

    Next

    GetPushZeroIP = IPaddr(0) & "." & IPaddr(1) & "." & IPaddr(2) & "." & IPaddr(3)

End Function




'아래 함수는 스트링 형식으로 되어있는 아이피를 바이트 배열로 다시 Long타입으로

'바꿔주는 함수입니다.

'일반적으로 잘 안쓰이지만 장비계통일 하다보면 장비의 아이피를 설정할때 쓰이게

'되는데 장비와 아이피 스트링을 주고 받으려면 Long타입으로 주고 받을 때 사용됩니다.

Public Function GetIptoLong(IPString As String) As Long

    Dim longip As Long

    Dim nCnt As Byte

    Dim value(4) As Byte

    Dim strTemp() As String

    

    If IPString = "" Then Exit Function

    strTemp = Split(IPString, ".")

    

    For nCnt = 0 To 3

        value(nCnt) = val(strTemp(nCnt))

    Next

        

    CopyMemory longip, value(0), 4

    GetIptoLong = longip

End Function






Public Function GetLongtoIp(ByVal longip As Long) As String

'아래함수는 위의 함수 역기능을 하는 함수로 Long타입으로 되어 있는 것을

'아이피 스트링 타입으로 변환합니다.

    Dim value(3) As Byte

    Dim nCnt As Byte

    CopyMemory value(0), longip, 4

    For nCnt = 0 To 3

        If value(nCnt) > 255 Then

            GetLongtoIp = "ERR"

            Exit Function

        End If

    Next

    GetLongtoIp = CStr(value(0)) & "." & CStr(value(1)) & "." & _

                     CStr(value(2)) & "." & CStr(value(3))

End Function