Ich möchte mit folgendem Programm ein einfaches BACnet Telegramm als Broadcast über das Netzwerk schicken. Tut alles prima, nur bekomme ich nicht heraus, wie ich den UDP-Port der Source einstellen kann. Kann mir jemand helfen?
Der Server Source Code zählt immer um eines weiter.
Code: Alles auswählen
InitNetwork()
Procedure.l SendMagicPacket(client_ip.s="255.255.255.255")
*SendePuffer = AllocateMemory(480)
Protected Success.l=0
Protected client_bip.l
Protected client_port.l
Protected client_bport.w
Protected client_socket.l
Protected socket_keepalive.b
Protected server_mode.l
RAW$ = "810B001501001000C4020000772201E091002201CA"
i= 0
For K = 1 To Len(RAW$)-1 Step 2
PokeB(*SendePuffer+i, Val("$"+Mid(RAW$,K,2)))
i = i+1
Next
client_bip = inet_addr_(client_ip)
client_port = 47808
client_bport = htons_(client_port) ; convert to long
client_socket = SOCKET_(#AF_INET, #SOCK_DGRAM, #IPPROTO_UDP) ; create the socket
If client_socket
socket_keepalive = 1
If setsockopt_(client_socket, #SOL_SOCKET, #SO_BROADCAST, @socket_keepalive, 1) = 0
sockaddr.SOCKADDR_IN
client_sockaddr\sin_family = #AF_INET
client_sockaddr\sin_port = client_bport
client_sockaddr\sin_addr = client_bip
server_mode = 0
If ioctlsocket_(client_socket,#FIONBIO,@server_mode) = 0
send.l = sendto_(client_socket, *SendePuffer, i, 0, @client_sockaddr, 16)
If send=i And WSAGetLastError_()=0
Debug "I-am packet send"
Success=1
EndIf
EndIf
EndIf
closesocket_(client_socket)
EndIf
FreeMemory(*SendePuffer)
ProcedureReturn Success
EndProcedure
SendMagicPacket()