读书人

,哪位高手知道这个代码有关问题出在那

发布时间: 2012-03-14 12:01:12 作者: rapoo

救命啊,谁知道这个代码问题出在那里啊!
这个不是 c++ 语言写的是 "PureBasic " 语言写的,但是跟 c++ 语言很相识.

厉害的人修改可以看出问题所在.

sendto_() API 函数一直返回 -1

WSAGetLastError_() 调式错误API 函数 一直返回 10022

我是搞个一个星期了,不知道问题在那里.. 那位哥哥可以帮我一把.. 谢谢了.

我是想发送 数据包中包含IP首部 的数据...

所以这里写的

#IP_HDRINCL = 2

If setsockopt_(SendSocket,#IPPROTO_IP,#IP_HDRINCL,@Flag,SizeOf(Flag)) = #SOCKET_ERROR
ProcedureReturn #Null
EndIf

---------- 下面是代码 -------------------


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)

[解决办法]
ptr = *ptr
------
不懂PureBasic,不过这句值得怀疑!

读书人网 >C++

热点推荐