Results 1 to 2 of 2

Thread: UDP listen does not read (TCP works fine)
Thanks Thanks: 0 Likes Likes: 0

  1. #1
    New Member
    Join Date
    Mar 2002
    Posts
    39
    Post Thanks / Like
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Default UDP listen does not read (TCP works fine)

    Hi

    UDP listen does not work, anyone can se what I am doing wrong ? (I have googled around but failed anyhow )

    I have copied most of the code below from internet, it worked with TCP, the only thing I have changed for the UDP listen case is that
    I replaced the two lines of the TCP part with the UDP part:
    -----------------------------------------------------------------
    'TCP
    'm_Hints.ai_socktype = sock_type.SOCK_STREAM
    'Server = "192.168.1.113"

    'UDP
    m_Hints.ai_socktype = sock_type.SOCK_DGRAM
    Server = "10.81.32.131"
    ------------------------------------------------------------------

    BR
    /Erik



    Code:
    Option Explicit
    ' Constants ----------------------------------------------------------
    Const INVALID_SOCKET = -1
    Const WSADESCRIPTION_LEN = 256
    Const SOCKET_ERROR = -1
    
    ' Typ definitions ----------------------------------------------------
    
    Private Type WSADATA
    wVersion As Integer
    wHighVersion As Integer
    szDescription(0 To WSADESCRIPTION_LEN) As Byte
    szSystemStatus(0 To WSADESCRIPTION_LEN) As Byte
    iMaxSockets As Integer
    iMaxUdpDg As Integer
    lpVendorInfo As Long
    End Type
    
    Private Type ADDRINFO
        ai_flags As Long
        ai_family As Long
        ai_socktype As Long
        ai_protocol As Long
        ai_addrlen As Long
        ai_canonName As LongPtr 'strptr
        ai_addr As LongPtr 'p sockaddr
        ai_next As LongPtr 'p addrinfo
    End Type
    
    
    
    ' External functions --------------------------------------------------
    
    Public Declare Function WSAStartup Lib "ws2_32.dll" (ByVal wVersionRequested As Integer, ByRef data As WSADATA) As Long
    Public Declare Function Connect Lib "ws2_32.dll" Alias "connect" (ByVal socket As Long, ByVal SOCKADDR As Long, ByVal namelen As Long) As Long
    Public Declare Sub WSACleanup Lib "ws2_32.dll" ()
    Private Declare PtrSafe Function GetAddrInfo Lib "ws2_32.dll" Alias "getaddrinfo" (ByVal NodeName As String, ByVal ServName As String, ByVal lpHints As LongPtr, lpResult As LongPtr) As Long
    Public Declare Function ws_socket Lib "ws2_32.dll" Alias "socket" (ByVal AF As Long, ByVal stype As Long, ByVal Protocol As Long) As Long
    Public Declare Function closesocket Lib "ws2_32.dll" (ByVal socket As Long) As Long
    Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
    Public Declare Function Send Lib "ws2_32.dll" Alias "send" (ByVal s As Long, ByRef buf As Any, ByVal buflen As Long, ByVal flags As Long) As Long
    Public Declare Function SendWithPtr Lib "ws2_32.dll" Alias "send" (ByVal s As Long, ByVal bufPtr As Long, ByVal buflen As Long, ByVal flags As Long) As Long
    Private Declare PtrSafe Function WSAGetLastError Lib "ws2_32.dll" () As Long
    Private Declare Function VarPtrArray Lib "VBE7" Alias "VarPtr" (var() As Any) As Long
    Private Declare Function recv Lib "wsock32.dll" (ByVal socket As Long, ByVal buffer As String, ByVal bufferLength As Long, ByVal flags As Long) As Long
    
    
    
    Sub TestWinsock_UDP()
        Dim m_wsaData As WSADATA
        Dim m_RetVal As Integer
        Dim m_Hints As ADDRINFO
        Dim m_ConnSocket As Long: m_ConnSocket = INVALID_SOCKET
        Dim Server As String
        Dim port As String
        Dim pAddrInfo As LongPtr
        Dim RetVal As Long
        Dim lastError As Long
    
        Dim iResult As Integer
    
        RetVal = WSAStartup(MAKEWORD(2, 2), m_wsaData)
        If (RetVal <> 0) Then
            LogError "WSAStartup failed with error " & RetVal, WSAGetLastError()
            Call WSACleanup
            Exit Sub
        End If
    
        m_Hints.ai_family = AF.AF_UNSPEC
        
    
        'TCP
        'm_Hints.ai_socktype = sock_type.SOCK_STREAM
         'Server = "192.168.1.113"
    
        'UDP
        m_Hints.ai_socktype = sock_type.SOCK_DGRAM
        Server = "10.81.32.131"
    
    
        port = "55999"
        
        
        RetVal = GetAddrInfo(Server, port, VarPtr(m_Hints), pAddrInfo)
        If (RetVal <> 0) Then
            LogError "Cannot resolve address " & Server & " and port " & port & ", error " & RetVal, WSAGetLastError()
            Call WSACleanup
            Exit Sub
        End If
    
        
        m_Hints.ai_next = pAddrInfo
        Dim connected As Boolean: connected = False
        Do While m_Hints.ai_next > 0
            CopyMemory m_Hints, ByVal m_Hints.ai_next, LenB(m_Hints)
    
            m_ConnSocket = ws_socket(m_Hints.ai_family, m_Hints.ai_socktype, m_Hints.ai_protocol)
    
            If (m_ConnSocket = INVALID_SOCKET) Then
                
            Else
                Dim connectionResult As Long
                connectionResult = Connect(m_ConnSocket, m_Hints.ai_addr, m_Hints.ai_addrlen)
    
                If connectionResult <> SOCKET_ERROR Then
                    connected = True
                    Exit Do
                End If
    
                closesocket (m_ConnSocket)
            End If
        Loop
    
        
    
    
        If Not connected Then
            MsgBox "Fatal error: unable to connect to the server"
            Call WSACleanup
            Exit Sub
        End If
    
    
        Dim recvBuf(200) As Byte
        Dim recvbuflen As Integer
        recvbuflen = 10
        iResult = 1
        
        Do While iResult > 0
       
            iResult = recv(m_ConnSocket, recvBuf(0), recvbuflen, 0)
            If iResult > 0 Then
                MsgBox "Bytes received: " & iResult
            ElseIf iResult = 0 Then
                MsgBox "Connection closed"
            Else
                MsgBox "recv failed: " & WSAGetLastError()
            End If
       
        Loop
        
    
        RetVal = closesocket(m_ConnSocket)
        If RetVal <> 0 Then
        LogError "closesocket() failed", WSAGetLastError()
        Call WSACleanup
        Else
            Debug.Print "closed socket"
        End If
    End Sub
    
    Public Function MAKEWORD(Lo As Byte, Hi As Byte) As Integer
    MAKEWORD = Lo + Hi * 256& Or 32768 * (Hi > 127)
    End Function
    
    Private Sub LogError(msg As String, Optional ErrorCode As Long = -1)
        If ErrorCode > -1 Then
            msg = msg & " (error code " & ErrorCode & ")"
        End If
    
        Debug.Print msg
    End Sub
    Last edited by Fluff; Aug 29th, 2019 at 11:44 AM. Reason: Added code tags

  2. #2
    New Member
    Join Date
    Mar 2002
    Posts
    39
    Post Thanks / Like
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Default Re: UDP listen does not read (TCP works fine)

    ah, solved it, just had to use bind instead of connect, now it works

Some videos you may like

User Tag List

Tags for this Thread

Like this thread? Share it with others

Like this thread? Share it with others

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •