首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

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

救命啊,谁知道这个代码问题出在那里啊!
这个不是   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,不过这句值得怀疑!

热点排行