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

小默

【轉(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在线 | 在线电影欧美日韩一区二区私密| 噜噜噜噜噜久久久久久91| 欧美影院在线| avtt综合网| 国产精品少妇自拍| 欧美精品一区二区三区一线天视频| 一区二区欧美亚洲| 亚洲韩国一区二区三区| 美女视频一区免费观看| 亚洲欧美日韩综合| 1000部精品久久久久久久久| 欧美激情导航| 欧美日韩国产999| 免费亚洲电影在线| 久久综合伊人77777蜜臀| 久久成人久久爱| 亚洲少妇一区| 欧美黄色网络| 国产精品sm| 国产精品青草久久久久福利99| 欧美欧美全黄| 欧美午夜电影完整版| 欧美性猛交xxxx乱大交蜜桃| 伊人春色精品| 欧美专区18| 欧美电影免费观看网站| 美女日韩在线中文字幕| 久久久噜噜噜久久中文字幕色伊伊| 欧美极品在线视频| 国产精品久久久久三级| 亚洲国产清纯| 亚洲免费av观看| 亚洲综合国产| 亚洲视频在线观看网站| 欧美精品福利| 亚洲夫妻自拍| 性欧美在线看片a免费观看| 久久久国产一区二区| 欧美jizz19性欧美| 久久久久9999亚洲精品| 国产伦精品一区二区三区免费迷| 亚洲日本成人女熟在线观看| 午夜在线观看免费一区| 性欧美激情精品| 国产日韩视频| 中文精品一区二区三区| 欧美成人免费大片| 小辣椒精品导航| 蜜臀av国产精品久久久久| 国产精品美女久久久久久2018| 亚洲午夜久久久久久尤物 | 欧美成年网站| 欧美大片在线观看| 合欧美一区二区三区| 欧美在线视频二区| 国产精品亚洲а∨天堂免在线| 久久青青草综合| 极品尤物一区二区三区| 久久精品在这里| 亚洲视频第一页| 亚洲精品国产拍免费91在线| 亚洲免费综合| 1000精品久久久久久久久| 欧美激情1区| 欧美亚日韩国产aⅴ精品中极品| 亚洲国产精品成人一区二区 | 亚洲夜间福利| 亚洲国产精品99久久久久久久久| 欧美激情第4页| 欧美福利一区二区| 免费试看一区| 国产日韩欧美一区二区三区在线观看| 久久久久久穴| 欧美黑人一区二区三区| 亚洲激情视频网站| 亚洲一区二区三区四区视频| 国产情人综合久久777777| 欧美黄色aa电影| 激情亚洲一区二区三区四区| 日韩午夜免费| 亚洲国产精品第一区二区| 亚洲日本欧美| 亚洲欧美视频在线观看| 欧美福利一区二区三区| 女人色偷偷aa久久天堂| 国产自产2019最新不卡| 亚洲午夜激情网页| 亚洲视频电影图片偷拍一区| 欧美一区1区三区3区公司| 麻豆国产va免费精品高清在线| 欧美顶级艳妇交换群宴| 一区二区在线视频播放| 久久精品国产91精品亚洲| 亚洲精品三级| 久久综合狠狠综合久久激情| 欧美在线三级| 欧美精品成人一区二区在线观看| 在线观看三级视频欧美| 亚洲国产欧美日韩另类综合| 欧美日韩一区二区三| 亚洲女同在线| 久久成人综合视频| 一区二区三区精品在线| 亚洲欧美在线一区| 日韩亚洲欧美一区| 欧美一区二区三区的| 亚洲美女色禁图| 性欧美1819性猛交| 国产精品入口麻豆原神| 欧美成人国产一区二区| 国产精品亚洲综合天堂夜夜| 亚洲激情午夜| 国产一区二区三区在线免费观看| 亚洲欧洲久久| 尤物99国产成人精品视频| 亚洲欧洲三级电影| 一区在线免费观看| 亚洲午夜极品| 日韩一级裸体免费视频| 欧美在线日韩| 小嫩嫩精品导航| 欧美日韩一区二区三区高清| 亚洲二区视频| 狠狠88综合久久久久综合网| 亚洲一区欧美二区| 99在线精品视频在线观看| 久久久国产一区二区| 久久av红桃一区二区小说| 国产精品成人一区二区网站软件| 欧美激情精品久久久| 亚洲福利视频三区| 久久福利一区| 麻豆国产精品777777在线| 黄色成人小视频| 久久九九久久九九| 免费成人黄色片| 国模吧视频一区| 久久国产福利国产秒拍| 久久九九热免费视频| 国产综合欧美| 欧美一区视频| 久久精品国产精品亚洲| 国语对白精品一区二区| 久久久久久噜噜噜久久久精品| 久久精品成人| 久久久久久穴| 国产精品乱子久久久久| 亚洲人成在线观看一区二区| 午夜精品一区二区三区四区| 亚洲小说区图片区| 米奇777超碰欧美日韩亚洲| 免费欧美在线视频| 伊人久久成人| 欧美成人四级电影| 亚洲国产岛国毛片在线| 亚洲国产欧美不卡在线观看| 久久精品国产亚洲5555| 狠狠色综合网| 久久一区中文字幕| 激情婷婷欧美| 一区二区高清视频| 久久精品视频在线播放| 日韩亚洲视频在线| 伊人久久男人天堂| 欧美成人免费在线| 久久久久网址| 一区二区三区www| 国产精品你懂的| 欧美中文字幕在线| 久久精品国产91精品亚洲| 国自产拍偷拍福利精品免费一| 久久久久一区二区三区四区| 久久综合色婷婷| 亚洲视频第一页| 性久久久久久| 亚洲免费电影在线| 亚洲欧美一区二区三区久久| 亚洲国产精品日韩| 日韩天堂av| 久久一二三四| 国产精品一区2区| 日韩天堂在线视频| 亚洲精品久久久久久久久久久久久| 亚洲欧美在线网| 国产视频一区在线观看| 最近看过的日韩成人| 一区二区三区成人精品| 国产欧美日韩另类视频免费观看| 久久在线视频在线| 亚洲人成网站精品片在线观看| 国产精品视频网站| 欧美精品日韩| 亚洲激情校园春色| 亚洲午夜精品久久久久久app| 亚洲欧美日韩国产中文| 国产精品美女主播| 欧美一级艳片视频免费观看| 久久亚洲春色中文字幕久久久|