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

小默

【轉(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 小默 閱讀(603) 評論(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>
            美乳少妇欧美精品| 国产精品久久中文| 亚洲欧美日韩综合一区| 久久艳片www.17c.com| 欧美一区二区三区电影在线观看| 免费短视频成人日韩| 久久久久久久久伊人| 国产精品毛片a∨一区二区三区| 亚洲欧洲在线免费| 樱桃国产成人精品视频| 欧美亚洲在线播放| 欧美一区二区三区视频| 国产精品美女www爽爽爽视频| 99在线热播精品免费99热| 一本到高清视频免费精品| 欧美激情四色| 亚洲欧洲视频在线| 99亚洲一区二区| 欧美理论在线播放| 日韩午夜高潮| 亚洲影视在线| 国产精品一级二级三级| 亚洲欧美一区二区激情| 欧美在线亚洲一区| 国产精品一香蕉国产线看观看| 亚洲视频在线观看视频| 欧美一乱一性一交一视频| 国产精品一区二区三区久久久| 亚洲午夜av电影| 久久国产精品99久久久久久老狼| 国产亚洲二区| 久久久精品一品道一区| 欧美高清在线视频观看不卡| 亚洲精品一级| 欧美色精品在线视频| 亚洲女人小视频在线观看| 久久精品一二三| 亚洲国产精品免费| 欧美激情视频在线播放| 亚洲一区二区三区在线播放| 久久精品30| 亚洲欧洲一二三| 欧美日韩综合视频网址| 亚洲免费网址| 免播放器亚洲| 久久亚洲二区| av不卡免费看| 久久亚洲欧洲| 一本久久综合| 国产一区二区毛片| 欧美激情亚洲另类| 午夜影院日韩| 亚洲国产美国国产综合一区二区| 在线亚洲一区| 樱桃成人精品视频在线播放| 欧美日本在线播放| 欧美在线观看www| 亚洲精品久久久一区二区三区| 午夜视频在线观看一区| 亚洲缚视频在线观看| 欧美性大战久久久久| 久久久国产成人精品| 日韩小视频在线观看| 久久夜色精品| 亚洲免费人成在线视频观看| 一区在线播放| 国产精品日韩一区二区| 欧美国产日韩xxxxx| 欧美一区二区三区另类| 日韩天堂在线观看| 欧美电影在线观看完整版| 香蕉久久夜色精品国产| 一本大道久久a久久综合婷婷| 精品成人国产| 国产农村妇女精品一二区| 欧美日韩xxxxx| 久久综合给合| 欧美一区二区三区的| 一区二区三区成人| 亚洲国产综合91精品麻豆| 久久亚洲国产成人| 亚洲欧美制服另类日韩| 99精品国产99久久久久久福利| 激情偷拍久久| 国模私拍一区二区三区| 国产精品三级久久久久久电影| 欧美理论电影网| 欧美—级在线免费片| 久久综合婷婷| 久久精品人人做人人综合| 亚洲欧美日本在线| 宅男在线国产精品| 在线亚洲免费视频| 99精品热视频只有精品10| 亚洲国产成人午夜在线一区| 欧美91大片| 欧美 日韩 国产 一区| 久久久午夜电影| 久久精品在线| 久久久中精品2020中文| 久久美女艺术照精彩视频福利播放| 欧美怡红院视频| 欧美一区观看| 久久精品色图| 久久久另类综合| 毛片基地黄久久久久久天堂| 久久精品欧美日韩| 久久久久国产精品麻豆ai换脸| 亚洲欧美日韩国产另类专区| 亚洲男人的天堂在线| 午夜日韩视频| 久久久国产成人精品| 久久偷看各类wc女厕嘘嘘偷窃| 老司机亚洲精品| 欧美激情aⅴ一区二区三区| 亚洲第一区中文99精品| 亚洲黄色有码视频| 亚洲美女视频网| 一区二区三区国产在线观看| 亚洲一区二区三区久久| 欧美一区二区在线免费播放| 久久久久久综合| 欧美激情四色| 国产精品专区一| 激情综合色综合久久综合| 久久精品国产精品亚洲综合| 久久综合给合| 欧美日韩一二区| 国产热re99久久6国产精品| 在线观看国产成人av片| 一区二区高清| 久久久久9999亚洲精品| 欧美韩国一区| 亚洲午夜视频在线| 狼狼综合久久久久综合网 | 欧美高清你懂得| 欧美日韩精品在线播放| 国产一区二区三区免费在线观看 | 亚洲欧美日韩在线播放| 久久久久久久久伊人| 亚洲激情六月丁香| 午夜一区在线| 欧美理论电影在线播放| 韩国精品在线观看| 亚洲一级在线| 欧美va亚洲va日韩∨a综合色| 99国产精品自拍| 久久免费黄色| 国产精品久久久久久久久久三级| 永久免费精品影视网站| 亚洲一区在线观看视频| 欧美成人精品一区| 亚洲自拍偷拍一区| 欧美国产日韩一区二区在线观看| 国产日韩欧美一区二区三区在线观看 | 国产精品入口日韩视频大尺度| 精品成人在线| 午夜日韩在线| 亚洲精品乱码久久久久久日本蜜臀 | 亚洲一区二区三区成人在线视频精品 | 久久男人资源视频| 国产女主播一区| 亚洲视屏一区| 亚洲国产清纯| 久久精品国产第一区二区三区最新章节| 欧美区在线播放| 91久久香蕉国产日韩欧美9色| 欧美在线黄色| 亚洲免费视频观看| 欧美三区在线视频| 日韩一级裸体免费视频| 欧美承认网站| 久久精品亚洲乱码伦伦中文 | 久久精品国产第一区二区三区最新章节| 亚洲三级免费| 欧美va天堂在线| 亚洲国产精品va在看黑人| 久久成人一区二区| 亚洲免费在线观看视频| 国产精品高潮呻吟| 亚洲一区免费在线观看| 亚洲美女av黄| 欧美日韩一二三区| 亚洲午夜精品福利| 日韩午夜在线| 欧美日韩伦理在线免费| 在线视频欧美日韩| 亚洲理伦在线| 欧美日韩一级黄| 亚洲一区二区在线看| 一本综合久久| 亚洲精品在线免费| 欧美三级中文字幕在线观看| 亚洲天堂av在线免费观看| 一区二区电影免费观看| 国产精品日韩欧美一区| 欧美中文在线观看国产| 欧美在线国产| 亚洲国产精品va在看黑人| 亚洲精品久久久久久下一站|