青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

小默

【轉(zhuǎn)】ping.py

差點勾成Jiong的分類了,因為最近真的很囧
#!/usr/bin/env python
#
 -*- coding: iso-8859-1 -*-
"""ping.py

ping.py uses the ICMP protocol's mandatory ECHO_REQUEST
datagram to elicit an ICMP ECHO_RESPONSE from a
host or gateway.

Copyright (C) 2004 - Lars Strand <lars strand at gnist org>;

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

Must be running as root, or write a suid-wrapper. Since newer *nix
variants, the kernel ignores the set[ug]id flags on #! scripts for
security reasons

RFC792, echo/reply message:

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Type      |     Code      |          Checksum             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Identifier          |        Sequence Number        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Data 
+-+-+-+-+-


TODO:
- do not create socket inside 'while' (but if not: ipv6 won't work)
- add support for broadcast/multicast
- add support for own payload string

CHANGELOG:
DONE -->; bugfix from Filip Van Raemdonck mechanix debian org
DONE -->; add more support for modules (raise instead of sys.exit)
DONE -->; locale func names
DONE -->; package def
DONE -->; some code cleanup

"""

import sys
import os
import struct
import array
import time
import select
import binascii
import math
import getopt
import string
import socket

# total size of data (payload)
ICMP_DATA_STR = 56

# initial values of header variables
ICMP_TYPE = 8
ICMP_TYPE_IP6 
= 128
ICMP_CODE 
= 0
ICMP_CHECKSUM 
= 0
ICMP_ID 
= 0
ICMP_SEQ_NR 
= 0

# Package definitions.
__program__   = 'ping'
__version__   = '0.5a'
__date__      = '2004/15/12'
__author__    = 'Lars Strand <lars at unik no>;'
__licence__   = 'GPL'
__copyright__ = 'Copyright (C) 2004 Lars Strand'

def _construct(id, size, ipv6):
    
"""Constructs a ICMP echo packet of variable size
    
"""

    
# size must be big enough to contain time sent
    if size < int(struct.calcsize("d")):
        _error(
"packetsize to small, must be at least %d" % int(struct.calcsize("d")))

    
# construct header
    if ipv6:
        header 
= struct.pack('BbHHh', ICMP_TYPE_IP6, ICMP_CODE, ICMP_CHECKSUM, \
                             ICMP_ID, ICMP_SEQ_NR
+id)
    
else:
        header 
= struct.pack('bbHHh', ICMP_TYPE, ICMP_CODE, ICMP_CHECKSUM, \
                             ICMP_ID, ICMP_SEQ_NR
+id)

    
# if size big enough, embed this payload
    load = "-- IF YOU ARE READING THIS YOU ARE A NERD! --"

    
# space for time
    size -= struct.calcsize("d")

    
# construct payload based on size, may be omitted :)
    rest = ""
    
if size > len(load):
        rest 
= load
        size 
-= len(load)

    
# pad the rest of payload
    rest += size * "X"

    
# pack
    data = struct.pack("d", time.time()) + rest
    packet 
= header + data          # ping packet without checksum
    checksum = _in_cksum(packet)    # make checksum

    
# construct header with correct checksum
    if ipv6:
        header 
= struct.pack('BbHHh', ICMP_TYPE_IP6, ICMP_CODE, checksum, \
                             ICMP_ID, ICMP_SEQ_NR
+id)
    
else:
        header 
= struct.pack('bbHHh', ICMP_TYPE, ICMP_CODE, checksum, ICMP_ID, \
                             ICMP_SEQ_NR
+id)

    
# ping packet *with* checksum
    packet = header + data

    
# a perfectly formatted ICMP echo packet
    return packet

def _in_cksum(packet):
    
"""THE RFC792 states: 'The 16 bit one's complement of
    the one's complement sum of all 16 bit words in the header.'

    Generates a checksum of a (ICMP) packet. Based on in_chksum found
    in ping.c on FreeBSD.
    
"""

    
print "packet =", packet

    
# add byte if not dividable by 2
    if len(packet) & 1:
        packet 
= packet + '\0'

    
print "packet = [after add byte]", packet

    
# split into 16-bit word and insert into a binary array
    words = array.array('h', packet)    # there's a big/little-endian issue
                                        # when analysis with wireshark
    sum = 0

    
print "words in packet array:", words

    
# perform ones complement arithmetic on 16-bit words
    for word in words:
        
print "process word:", hex(word)
        sum 
+= (word & 0xffff)
        
print "sum:", hex(sum)

    hi 
= sum >> 16
    
print "hi:", hex(hi)
    lo 
= sum & 0xffff
    
print "lo:", hex(lo)
    sum 
= hi + lo # one's complement
    print "sum(=hi+lo):", hex(sum)
    sum 
= sum + (sum >> 16# TODO: another one's complement, why we need this?
                            # sum is at most 16 bit, so here do nothing.???
    print "sum(=sum+(sum>>16)):", hex(sum)
    
print (~sum) & 0xffff # TODO: the implement of one number is just ~ ?

    
return (~sum) & 0xffff # return ones complement

# We know whether the host we will ping is alive before we call this function?
def pingNode(alive=0, timeout=1.0, ipv6=0, number=sys.maxint, node=None, \
             flood
=0, size=ICMP_DATA_STR):
    
"""Pings a node based on input given to the function.
    
"""

    
# if no node, exit
    if not node:
        _error(
"")

    
# if not a valid host, exit
    if ipv6:
        
if socket.has_ipv6:
            
try:
                info, port 
= socket.getaddrinfo(node, None)
                host 
= info[4][0]
                
# do not print ipv6 twice if ipv6 address given as node
                if host == node:
                    noPrintIPv6adr 
= 1
            
except:
                _error(
"cannot resolve %s: Unknow host" % node)
        
else:
            _error(
"No support for IPv6 on this plattform")
    
else:    # IPv4
        try:
            host 
= socket.gethostbyname(node)
        
except:
            _error(
"cannot resolve %s: Unknow host" % node)

    
# trying to ping a network?
    # TODO: if a ip is end with ".0", so it must be a network?
    #       and why we cannot ping a network?
    #       ICMP cannot broadcast?
    if not ipv6:
        
if int(string.split(host, ".")[-1]) == 0:
            _error(
"no support for network ping")

    
# do some sanity check
    if number == 0:
        _error(
"invalid count of packets to transmit: '%s'" % str(a))
    
if alive: # TODO: what does alive mean?
        number = 1

    
# Send the ping(s)
    start = 1; mint = 999; maxt = 0.0; avg = 0.0
    lost 
= 0; tsum = 0.0; tsumsq = 0.0

    
# tell the user what we do
    if not alive:
        
if ipv6:
            
# do not print the ipv6 twice if ip adress given as node
            # (it can be to long in term window)
            if noPrintIPv6adr == 1:
                
# add 40 (header) + 8 (icmp header) + payload
                print "PING %s : %d data bytes (40+8+%d)" % (str(node), \
                                                             
40+8+size, size)
            
else:
                
# add 40 (header) + 8 (icmp header) + payload
                print "PING %s (%s): %d data bytes (40+8+%d)" % (str(node), \
                                                                 str(host), 
40+8+size, size)
        
else:
            
# add 20 (header) + 8 (icmp header) + payload
            print "PING %s (%s): %d data bytes (20+8+%d)" % (str(node), str(host), \
                                                             
20+8+size, size)

    
# trap ctrl-d and ctrl-c
    try:

        
# send the number of ping packets as given
        while start <= number:
            lost 
+= 1 # in case user hit ctrl-c
                      # TODO: what does this mean?

            
# create the IPv6/IPv4 socket
            if ipv6:
                
# can not create a raw socket if not root or setuid to root
                try:
                    pingSocket 
= socket.socket(socket.AF_INET6, socket.SOCK_RAW, \
                                               socket.getprotobyname(
"ipv6-icmp"))
                
except socket.error, e:
                    
print "socket error: %s" % e
                    _error(
"You must be root (uses raw sockets)" % os.path.basename(sys.argv[0]))

            
# IPv4
            else:
                
# can not create a raw socket if not root or setuid to root
                try:
                    pingSocket 
= socket.socket(socket.AF_INET, socket.SOCK_RAW, \
                                               socket.getprotobyname(
"icmp"))
                
except socket.error, e:
                    
print "socket error: %s" % e
                    _error(
"You must be root (%s uses raw sockets)" % os.path.basename(sys.argv[0]))

            packet 
= _construct(start, size, ipv6) # make a ping packet

            
# send the ping
            try:
                pingSocket.sendto(packet,(node,
1))
            
except socket.error, e:
                _error(
"socket error: %s" % e)

            
# reset values
            pong = ""; iwtd = []

            
# wait until there is data in the socket
            while 1:
                
# input, output, exceptional conditions
                iwtd, owtd, ewtd = select.select([pingSocket], [], [], timeout)
                
break # no data and timout occurred

            
# data on socket - this means we have an answer
            if iwtd:  # ok, data on socket
                endtime = time.time()  # time packet received
                # read data (we only need the header)
                pong, address = pingSocket.recvfrom(size+48)
                lost 
-= 1 # in case user hit ctrl-c

                
# examine packet
                # fetch TTL from IP header
                if ipv6:
                    
# since IPv6 header and any extension header are never passed
                    # to a raw socket, we can *not* get hoplimit field..
                    # I hoped that a socket option would help, but it's not
                    # supported:
                    #   pingSocket.setsockopt(IPPROTO_IPV6, IPV6_RECVHOPLIMIT, 1)
                    # so we can't fetch hoplimit..

                    
# fetch hoplimit
                    #rawPongHop = struct.unpack("c", pong[7])[0]

                    
# fetch pong header
                    pongHeader = pong[0:8]
                    pongType, pongCode, pongChksum, pongID, pongSeqnr 
= \
                              struct.unpack(
"bbHHh", pongHeader)

                    
# fetch starttime from pong
                    starttime = struct.unpack("d", pong[8:16])[0]

                
# IPv4
                else:
                    
# time to live
                    rawPongHop = struct.unpack("s", pong[8])[0]

                    
# convert TTL from 8 bit to 16 bit integer
                    pongHop = int(binascii.hexlify(str(rawPongHop)), 16)

                    
# fetch pong header
                    pongHeader = pong[20:28]
                    pongType, pongCode, pongChksum, pongID, pongSeqnr 
= \
                              struct.unpack(
"bbHHh", pongHeader)

                    
# fetch starttime from pong
                    starttime = struct.unpack("d", pong[28:36])[0]

                
# valid ping packet received?
                if not pongSeqnr == start:
                    pong 
= None

            
# NO data on socket - timeout waiting for answer
            if not pong:
                
if alive:
                    
print "no reply from %s (%s)" % (str(node), str(host))
                
else:
                    
print "ping timeout: %s (icmp_seq=%d) " % (host, start)

                
# do not wait if just sending one packet
                if number != 1 and start < number:
                    time.sleep(flood 
^ 1)
                start 
+= 1
                
continue  # lost a packet - try again

            triptime  
= endtime - starttime # compute RRT
            tsum     += triptime            # triptime for all packets (stddev)
            tsumsq   += triptime * triptime # triptime^2  for all packets (stddev)

            
# compute statistic
            maxt = max ((triptime, maxt))
            mint 
= min ((triptime, mint))

            
if alive:
                
print str(node) + " (" + str(host) +") is alive"
            
else:
                
if ipv6:
                    
# size + 8 = payload + header
                    print "%d bytes from %s: icmp_seq=%d time=%.5f ms" % \
                          (size
+8, host, pongSeqnr, triptime*1000)
                
else:
                    
print "%d bytes from %s: icmp_seq=%d ttl=%s time=%.5f ms" % \
                          (size
+8, host, pongSeqnr, pongHop, triptime*1000)

            
# do not wait if just sending one packet
            if number != 1 and start < number:
                
# if flood = 1; do not sleep - just ping
                time.sleep(flood ^ 1# wait before send new packet

            
# the last thing to do is update the counter - else the value
            # (can) get wrong when computing summary at the end (if user
            # hit ctrl-c when pinging)
            start += 1
            
# end ping send/recv while

    
# if user ctrl-d or ctrl-c
    except (EOFError, KeyboardInterrupt):
        
# if user disrupts ping, it is most likly done before
        # the counter get updates - if do not update it here, the
        # summary get all wrong.
        start += 1
        
pass

    
# compute and print som stats
    # stddev computation based on ping.c from FreeBSD
    if start != 0 or lost > 0:  # do not print stats if 0 packet sent
        start -= 1              # since while is '<='
        avg = tsum / start      # avg round trip
        vari = tsumsq / start - avg * avg
        
# %-packet lost
        if start == lost:
            plost 
= 100
        
else:
            plost 
= (lost/start)*100

        
if not alive:
            
print "\n--- %s ping statistics ---" % node
            
print "%d packets transmitted, %d packets received, %d%% packet loss" % \
                  (start, start
-lost, plost)
            
# don't display summary if 100% packet-loss
            if plost != 100:
                
print "round-trip min/avg/max/stddev = %.3f/%.3f/%.3f/%.3f ms" % \
                      (mint
*1000, (tsum/start)*1000, maxt*1000, math.sqrt(vari)*1000)

    pingSocket.close()

def _error(err):
    
"""Exit if running standalone, else raise an exception
    
"""

    
if __name__ == '__main__':
        
print "%s: %s" % (os.path.basename(sys.argv[0]), str(err))
        
print "Try `%s --help' for more information." % os.path.basename(sys.argv[0])
        sys.exit(
1)
    
else:
        
raise Exception, str(err)

def _usage():
    
"""Print usage if run as a standalone program
    
"""
    
print """usage: %s [OPTIONS] HOST
Send ICMP ECHO_REQUEST packets to network hosts.

Mandatory arguments to long options are mandatory for short options too.
  -c, --count=N    Stop after sending (and receiving) 'N' ECHO_RESPONSE
                   packets.
  -s, --size=S     Specify the number of data bytes to be sent. The default
                   is 56, which translates into 64 ICMP data bytes when
                   combined with the 8 bytes of ICMP header data.
  -f, --flood      Flood ping. Outputs packets as fast as they come back. Use
                   with caution!
  -6, --ipv6       Ping using IPv6.
  -t, --timeout=s  Specify a timeout, in seconds, before a ping packet is
                   considered 'lost'.
  -h, --help       Display this help and exit

Report bugs to lars [at] gnist org
""" % os.path.basename(sys.argv[0])


if __name__ == '__main__':
    
"""Main loop
    
"""

    
# version control
    version = string.split(string.split(sys.version)[0][:3], ".")
    
if map(int, version) < [23]:
        _error(
"You need Python ver 2.3 or higher to run!")

    
try:
        
# opts = arguments recognized,
        # args = arguments NOT recognized (leftovers)
        opts, args = getopt.getopt(sys.argv[1:-1], "hat:6c:fs:", \
                                   [
"help""alive""timeout=""ipv6", \
                                    
"count=""flood""packetsize="])
    
except getopt.GetoptError:
        
# print help information and exit:
        _error("illegal option(s) -- " + str(sys.argv[1:]))

    
# test whether any host given
    if len(sys.argv) >= 2:
        node 
= sys.argv[-1:][0]   # host to be pinged
        if node[0] == '-' or node == '-h' or node == '--help' :
            _usage()
    
else:
        _error(
"No arguments given")

    
if args:
        _error(
"illegal option -- %s" % str(args))

    
# default variables
    alive = 0; timeout = 1.0; ipv6 = 0; count = sys.maxint;
    flood 
= 0; size = ICMP_DATA_STR

    
# run through arguments and set variables
    for o, a in opts:
        
if o == "-h" or o == "--help":    # display help and exit
            _usage()
            sys.exit(0)
        
if o == "-t" or o == "--timeout"# timeout before "lost"
            try:
                timeout 
= float(a)
            
except:
                _error(
"invalid timout: '%s'" % str(a))
        
if o == "-6" or o == "--ipv6":    # ping ipv6
            ipv6 = 1
        
if o == "-c" or o == "--count":   # how many pings?
            try:
                count 
= int(a)
            
except:
                _error(
"invalid count of packets to transmit: '%s'" % str(a))
        
if o == "-f" or o == "--flood":   # no delay between ping send
            flood = 1
        
if o == "-s" or o == "--packetsize":  # set the ping payload size
            try:
                size 
= int(a)
            
except:
                _error(
"invalid packet size: '%s'" % str(a))
        
# just send one packet and say "it's alive"
        if o == "-a" or o == "--alive":
            alive 
= 1

    
# here we send
    pingNode(alive=alive, timeout=timeout, ipv6=ipv6, number=count, \
             node
=node, flood=flood, size=size)
    
# if we made it this far, do a clean exit
    sys.exit(0)

### end

posted on 2010-10-25 22:16 小默 閱讀(609) 評論(0)  編輯 收藏 引用 所屬分類: Network

導(dǎo)航

統(tǒng)計

留言簿(13)

隨筆分類(287)

隨筆檔案(289)

漏洞

搜索

積分與排名

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久久国产精品厨房| 久久久久久一区| 一区二区三区在线视频观看| 国产欧美1区2区3区| 一区在线观看| 亚洲午夜精品视频| 美女主播一区| 亚洲调教视频在线观看| 免费成年人欧美视频| 国产免费成人av| 在线精品视频在线观看高清| 亚洲欧美激情视频在线观看一区二区三区| 久久久亚洲精品一区二区三区| 亚洲区一区二| 久久国产手机看片| 国产精品爱久久久久久久| 中文在线资源观看视频网站免费不卡| 亚洲国产色一区| 欧美日本中文| 亚洲综合电影| 午夜视频精品| 在线看片成人| 亚洲国产片色| 欧美小视频在线观看| 欧美亚洲免费在线| 欧美一区中文字幕| 亚洲黑丝在线| 99re热精品| 国产三级欧美三级日产三级99| 久久久99精品免费观看不卡| 亚洲欧美国产日韩天堂区| 国产午夜精品视频| 欧美国产第一页| 欧美日韩精品一区二区三区| 亚洲永久免费观看| 欧美在线free| 亚洲精品美女久久7777777| 亚洲乱码国产乱码精品精天堂| 欧美香蕉大胸在线视频观看| 久久久久国产精品麻豆ai换脸| 久久午夜电影| 亚洲一二三区在线观看| 欧美在线观看www| 亚洲日本欧美日韩高观看| 99国产精品久久久久老师| 国产欧美一区二区三区沐欲| 欧美激情按摩| 欧美日韩精品在线观看| 国产午夜精品理论片a级大结局| 午夜精品久久久久久久99樱桃| 亚洲欧美电影院| 一区二区三区在线观看欧美| 亚洲欧洲一区二区在线播放| 国产精品区一区二区三区| 免费成人黄色av| 欧美日韩免费在线观看| 久久麻豆一区二区| 欧美日韩在线观看一区二区| 久久午夜精品| 国产精品久久777777毛茸茸| 欧美电影免费观看高清完整版| 国产精品久久久久久五月尺| 欧美好骚综合网| 国产亚洲精品久久久久动| 亚洲精品国产系列| 在线观看亚洲精品| 午夜精品久久久久久久99樱桃| 亚洲精品一区二区三区av| 欧美一区二区三区四区在线观看地址| 亚洲久色影视| 久久影视三级福利片| 久久精品国产一区二区三区| 欧美三级不卡| 最新精品在线| 亚洲第一天堂av| 久久精品国产99国产精品| 午夜一区二区三视频在线观看| 欧美成人视屏| 欧美韩日一区二区三区| 很黄很黄激情成人| 久久福利毛片| 欧美在线视频二区| 国产精品久久久久久久久动漫| 亚洲日本一区二区| 亚洲人成绝费网站色www| 久久人人97超碰精品888| 久久九九免费| 国产综合久久久久影院| 亚洲欧美日韩网| 香蕉久久久久久久av网站| 国产精品爱久久久久久久| 亚洲美女黄网| 亚洲一区二区成人在线观看| 欧美日韩亚洲视频| 日韩午夜三级在线| 亚洲午夜电影网| 欧美调教vk| 亚洲自拍三区| 久久精品视频播放| 好看的日韩av电影| 久久免费少妇高潮久久精品99| 美女国产精品| 亚洲韩国青草视频| 欧美国产日韩xxxxx| 亚洲激情网址| 亚洲一区二区在线看| 国产精品卡一卡二卡三| 亚洲欧美日韩国产精品 | 亚洲视频 欧洲视频| 欧美午夜在线视频| 亚洲欧美日韩一区在线| 久久婷婷蜜乳一本欲蜜臀| 亚洲电影免费| 狠狠色综合色区| 最新国产成人av网站网址麻豆| 亚洲高清影视| 欧美黄色免费| a91a精品视频在线观看| 性伦欧美刺激片在线观看| 韩国av一区二区三区四区| 美女国产一区| 亚洲视频在线观看视频| 久久美女性网| 99一区二区| 国产亚洲观看| 欧美精品xxxxbbbb| 午夜精品久久久久久久99樱桃| 美日韩精品视频| 日韩午夜精品| 国产欧美日韩亚洲精品| 欧美gay视频| 午夜视频一区| 亚洲日本成人网| 久久久久青草大香线综合精品| 日韩视频一区二区| 国产一级精品aaaaa看| 欧美国产视频一区二区| 亚洲欧美国产精品专区久久| 农夫在线精品视频免费观看| 亚洲图片你懂的| 亚洲第一黄网| 国产亚洲精品一区二555| 欧美屁股在线| 老司机aⅴ在线精品导航| 亚洲一区久久久| 亚洲欧洲在线一区| 麻豆精品视频在线观看视频| 亚洲影视九九影院在线观看| 在线欧美影院| 国产婷婷色一区二区三区在线 | 国产亚洲精品资源在线26u| 欧美激情第8页| 久久久在线视频| 亚洲欧洲av一区二区| 亚洲乱码国产乱码精品精可以看| 欧美成年人网站| 久久精品一区二区三区四区| 亚洲免费中文字幕| 一区二区三区www| 亚洲国产天堂网精品网站| 黄色欧美日韩| 黑人操亚洲美女惩罚| 国产日韩一级二级三级| 国产精品日韩精品欧美在线| 欧美日韩国产综合久久| 欧美成人国产一区二区| 久久综合久色欧美综合狠狠| 久久大香伊蕉在人线观看热2| 亚洲影视中文字幕| 亚洲一区黄色| 亚洲欧美卡通另类91av| 在线一区亚洲| 亚洲在线成人精品| 亚洲一区二区在线免费观看| 亚洲视频综合在线| 亚洲影视九九影院在线观看| 亚洲欧美美女| 欧美亚洲尤物久久| 久久精品视频亚洲| 久久青草欧美一区二区三区| 久久午夜色播影院免费高清| 久久这里有精品15一区二区三区| 久久精品99国产精品酒店日本| 欧美在线高清视频| 久久尤物电影视频在线观看| 欧美成人午夜激情在线| 欧美精品成人| 国产精品激情| 午夜伦欧美伦电影理论片| 亚洲欧美成人一区二区三区| 亚洲啪啪91| 亚洲精品在线二区| 亚洲天堂成人| 亚洲自拍啪啪| 久久久精品国产免费观看同学| 久久久中精品2020中文| 欧美成人精品在线观看| 亚洲第一区中文99精品| 亚洲乱码国产乱码精品精| 亚洲专区在线|