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
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 a moderator: