2014-07-01 92 views
3

我想從原始套接字(在窗口上,如果這是相關的)發送一個自定義UDP數據包到我的VPS上的udp偵聽器,但數據包永遠不會顯示在它的目的地。Python原始udp數據包未到達udp偵聽器

客戶: 進口結構 進口插座

def make_ipv4_header(srcip, dstip, datal, srcprt, dstprt): 
    srcip = socket.inet_aton(srcip) 
    dstip = socket.inet_aton(dstip) 

    ver = 4  #Version 4 for IPv4 
    ihl = 5  #Header length in 32 bit words. 5 words == 20 bytes 
    dscp_ecn = 0#Optional fields, don't feel like implementing. Let's keep it at 0 
    tlen = datal + 28 #Length of data + 20 bytes for ipv4 header + 8 bytes for udp  header 
    ident = socket.htons(54321) #ID of packet 
    flg_frgoff = 0 #Flags and fragment offset 
    ttl = 64 #Time to live 
    ptcl = 17 #Protocol, 17 (UDP) 
    chksm = 0 #Will automatically fill in checksum  

    return struct.pack(
     "!"  #Network(Big endian) 
     "2B" #Version and IHL, DSCP and ECN 
     "3H" #Total Length, Identification, Flags and Fragment Offset 
     "2B" #Time to live, Protocol 
     "H"  #Checksum 
     "4s" #Source ip 
     "4s" #Destination ip 
     , (ver << 4) + ihl, dscp_ecn, tlen, ident, flg_frgoff, ttl, ptcl, chksm, srcip, dstip) 

def make_udp_header(srcprt, dstprt, datal): 
    return struct.pack(
     "!4H" #Source port, Destination port, Length, Checksum 
     , srcprt, dstprt, datal+16, 0) 

def makepacket(src, dst, data): 
    ph = make_ipv4_header(src[0], dst[0], len(data), src[1], dst[1]) 
    uh = make_udp_header(src[1], dst[1], len(data)) 
    return ph+uh+data 

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW) 
packet = makepacket(("my ip", 1000), ("vps ip", 10101), "asdf") 
s.sendto(packet, ("vps ip", 10101)) 

服務器:

import socket 
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
s.bind(("", 10101)) 
while True: 
    msg, addr = s.recvfrom(1024) 
    print msg, addr 

我可以給一個統一的UDP數據包,它會到達成功的,像這樣:

import socket 
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
s.sendto("asdf", ("vps ip", 10101)) 

幫幫我?

回答

-1

變化的這幾行

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW) 
packet = makepacket(("my ip", 1000), ("vps ip", 10101), "asdf") 
s.sendto(packet, ("vps ip", 10101)) 

通過

s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 
packet = makepacket(("my ip", 1000), ("vps ip", 10101), "asdf") 
s.connect(('vps ip',10101)) 
s.send(packet) 

希望這就是你要找的人!

1

make_udp_header將數據從+16更改爲+8。這似乎對我有用。