Thank everyone!
sendto_() Return "-1"
WSAGetLastError_() Return "10022"
Code: Select all
Structure IP_HEADER
h_verlen.b
tos.b
total_len.w
ident.w
frag_and_flags.w
ttl.b
proto.b
checksum.w
sourceip.l
destip.l
EndStructure
Structure UDP_HEADER
sourceport.w
destport.w
udp_length.w
udp_checksum.w
EndStructure
Procedure.l checksum(*buffer,size.l)
While(size>1)
MoveMemory(*buffer,@val.l,2)
cksum.l=cksum.l+val
*buffer=*buffer+2
size=size-2
Wend
If(size)
MoveMemory(*buffer,@val.l,1)
cksum=cksum+val
EndIf
cksum=(cksum>>16)+(cksum & $FFFF)
cksum=cksum+(cksum>>16)
ProcedureReturn ~cksum
EndProcedure
Procedure UDP(Ip.s,Port.l)
Define Wsa.WSADATA
Define *Wsa = @Wsa
Define pBuffer.s
Define ipHeader.IP_HEADER
Define udpHeader.UDP_HEADER
Define nBufferSize.l = 1024
Define pSendBuffer.s
Define iTotalSize.l
Define iUdpCheckSumSize.l = 0
Define *ptr = AllocateMemory(nBufferSize+60)
Define ptr.l
Define SendSocket.l
Define Flag.l = 1
Define addr_in.SOCKADDR_IN
If WSAStartup_($101, *wsa) <> 0
ProcedureReturn #Null
EndIf
SendSocket = SOCKET_(#AF_INET,#SOCK_RAW,#IPPROTO_UDP)
If SendSocket = #INVALID_SOCKET
ProcedureReturn #Null
EndIf
#IP_HDRINCL = 2
If setsockopt_(SendSocket,#IPPROTO_IP,#IP_HDRINCL,@Flag,SizeOf(Flag)) = #SOCKET_ERROR
ProcedureReturn #Null
EndIf
iTotalSize = SizeOf(ipHeader) + SizeOf(udpHeader)+ nBufferSize
ipHeader\h_verlen = (4<<4)|(SizeOf(IP_HEADER)/4)
ipHeader\tos = 0
ipHeader\total_len = htons_(iTotalSize)
ipHeader\ident = 0
ipHeader\frag_and_flags = 0
ipHeader\ttl = 128
ipHeader\proto = #IPPROTO_UDP
ipHeader\checksum = 0
ipHeader\destIP = inet_addr_(Ip)
ipHeader\sourceIP = inet_addr_("192.167.1.2")
udpHeader\sourceport = htons_(5444)
udpHeader\destport = htons_(Port)
udpHeader\udp_length = htons_(SizeOf(udpHeader) + nBufferSize)
udpHeader\udp_checksum = 0
ZeroMemory_(*ptr,nBufferSize + 60)
ptr = *ptr
MoveMemory(@ipheader\sourceip,ptr,SizeOf(ipheader\sourceip))
ptr = ptr + SizeOf(ipHeader\sourceIP)
iUdpCheckSumSize = iUdpCheckSumSize + SizeOf(ipHeader\sourceIP)
MoveMemory(@ipHeader\destIP,ptr,SizeOf(ipHeader\destIP))
ptr = ptr + SizeOf(ipHeader\destIP)
iUdpCheckSumSize = iUdpCheckSumSize + SizeOf(ipHeader\destIP)
ptr = ptr + 1
iUdpCheckSumSize = iUdpCheckSumSize + 1
MoveMemory(@ipHeader\proto,ptr,SizeOf(ipHeader\proto))
ptr = ptr + SizeOf(ipHeader\proto)
iUdpCheckSumSize = iUdpCheckSumSize + SizeOf(ipHeader\proto)
MoveMemory(@udpHeader\udp_length,ptr,SizeOf(udpHeader\udp_length))
ptr = ptr + SizeOf(udpHeader\udp_length)
iUdpCheckSumSize = iUdpCheckSumSize + SizeOf(udpHeader\udp_length)
MoveMemory(@udpHeader,ptr,SizeOf(udpHeader))
ptr = ptr + SizeOf(udpHeader)
iUdpCheckSumSize = iUdpCheckSumSize + SizeOf(udpHeader)
pBuffer = Space(1024)
FillMemory_(@pBuffer,nBufferSize,65)
MoveMemory(@pBuffer,ptr,nBufferSize)
iUdpCheckSumSize = iUdpCheckSumSize + nBufferSize
udpHeader\udp_checksum = checksum(*ptr,iUdpCheckSumSize)
MoveMemory(@ipHeader,*ptr,SizeOf(ipHeader))
MoveMemory(@udpHeader,*ptr + SizeOf(ipHeader),SizeOf(udpHeader))
MoveMemory(@pBuffer,*ptr +SizeOf(ipHeader) + SizeOf(udpHeader),nBufferSize)
addr_in\sin_family = #AF_INET
addr_in\sin_port = htons_(Port)
addr_in\sin_addr = inet_addr_(Ip)
Debug sendto_(SendSocket,*ptr,iTotalSize,0,@addr_in, SizeOf(addr_in))
Debug WSAGetLastError_()
closesocket_(SendSocket)
EndProcedure
UDP("192.168.1.3",1228)