免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 52374 | 回复: 37

作为一名Python爱好者,你懂网络编程吗? [复制链接]

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
发表于 2015-01-07 11:00 |显示全部楼层
获奖名单已公布http://bbs.chinaunix.net/thread-4168068-1-1.html

话题背景

Python是门很棒的语言,它可以用来做系统管理,也可以拿来做网络编程,甚至可以拿来开发网站、运维后台。越来越多的系统管理人员/运维开发人员喜欢用Python来编程,Python可以配合一些监控软件使用(比如Nagios),也可以根据自己的要求来实现某方面的监控。想用Python来做网络编程,那你多多少少应该了解TCP/IP协议和Python基础知识。Python丰富的第三方库使Python编程变得简单,大部分情况下我们都无需再造轮子。



讨论话题
1.说说你对TCP/IP协议的了解有多少。
2.说说你对Python基础知识的了解有多少。
3.说说你读完本章节后的感谢。(图书链接在下方)
4.请给出一段跟网络编程相关的Python代码并简单说明一下它的功能。

讨论时间
2015-01-07至2015-01-26

活动奖励
活动结束后将选取4名分享精彩的童鞋,每人赠送一本《Python网络编程攻略》作为奖励。

奖品简介
s27745794.jpg
作者:M.O.Faruque Sarker博士
译者:安道
出版社:人民邮电出版社
ISBN:9787115372697
出版时间:2014-12-01
开本:16开
页数:170
版次:1

作者简介

M. O. Faruque Sarker博士,是软件架构师,开发运维工程师,最近几年主持开发了很多Python软件项目。他是多种开源技术方面的专家,对于在线学习平台、Web应用平台、敏捷软件开发等技术有深入的研究。从1999年开始,他一直在部署Linux和开源软件。他应邀参与了2009年和2010年的谷歌编程之夏,为开源项目BlueZ和Tahoe-LAFS做出了贡献。目前他在英国伦敦大学学院工作,研究方向是自组织云架构。



内容简介

《图灵程序设计丛书:Python网络编程攻略》介绍了现实世界中几乎所有网络任务的真实示例,通过简明易懂的形式让读者掌握如何使用Python完成这些网络编程任务。具体说来,书中通过70多篇攻略讨论了Python网络编程的高阶话题,包括编写简单的网络客户端和服务器、HTTP协议网络编程、跨设备编程、屏幕抓取以及网络安全监控,等等。本书可以作为任何一门网络编程课程中培养实践技能的补充材料。《图灵程序设计丛书:Python网络编程攻略》需要读者对Python语言及TCP/IP等基本的网络概念有了解,但即使不精通也能通过本书理解相关概念。

《图灵程序设计丛书:Python网络编程攻略》适合网络程序员、系统/网络管理员及Web应用程序开发人员阅读。



在线试读
http://www.ituring.com.cn/book/1484

论坛徽章:
16
CU十二周年纪念徽章
日期:2013-10-24 15:41:3415-16赛季CBA联赛之广东
日期:2015-12-23 21:21:55青铜圣斗士
日期:2015-12-05 10:35:30黄金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日论坛发贴之星
日期:2015-11-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-18 06:20:002015亚冠之城南
日期:2015-11-10 19:10:492015亚冠之萨济拖拉机
日期:2015-10-28 18:47:282015亚冠之柏太阳神
日期:2015-08-30 17:21:492015亚冠之山东鲁能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
发表于 2015-01-07 11:47 |显示全部楼层
支持!以前看过一些基础

论坛徽章:
49
15-16赛季CBA联赛之福建
日期:2016-06-22 16:22:002015年亚洲杯之中国
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36双鱼座
日期:2015-01-02 22:04:33午马
日期:2014-11-25 09:58:35辰龙
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43辰龙
日期:2014-08-21 10:47:58
发表于 2015-01-07 12:57 |显示全部楼层
tc1989tc 发表于 2015-01-07 11:47
支持!以前看过一些基础


欢迎大家多交流:)

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每月发帖之星
日期:2015-09-11 19:30:52IT运维版块每周发帖之星
日期:2015-09-11 19:20:31IT运维版块每日发帖之星
日期:2015-08-26 06:20:00每日论坛发贴之星
日期:2015-08-20 06:20:00IT运维版块每日发帖之星
日期:2015-08-20 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:15金牛座
日期:2014-05-04 16:58:09双子座
日期:2013-12-17 16:44:37辰龙
日期:2013-11-22 15:20:59狮子座
日期:2013-11-18 22:55:08射手座
日期:2013-11-12 10:54:26
发表于 2015-01-07 17:09 |显示全部楼层
本帖最后由 wenhq 于 2015-01-08 13:22 编辑

1.说说你对TCP/IP协议的了解有多少。
TCP/IP协议族是一个很庞大的协议系统。里面涵盖了好多东西,如常规的UDP,TCP,tcp有限状态机,慢启动,快速恢复,拥塞机制,滑动窗口,各种算法,还有一些多路复用,分组交换。
对于TCP/IP中应用最多的就是LVS。其搭配的工具有tcpdump tshark  snoop
2.说说你对Python基础知识的了解有多少。
python基础还算可以把,个人觉得基础一般般。还有好多个方面需要学习。比如:GIL,私有属性和私有变量,装饰器和生成器,此外还有元编程,这算是比较高级一些的?
3.说说你读完本章节后的感谢。(图书链接在下方)
书写的很不错,编排的循序渐进。很不错,比较喜欢。
但需要有一定的基础才可行。
4.请给出一段跟网络编程相关的Python代码并简单说明一下它的功能。
  1. #!/usr/bin/python           # This is server.py file

  2. import socket               # Import socket module

  3. s = socket.socket()         # Create a socket 对象
  4. host = socket.gethostname() # Get local machine name
  5. port = 12345                # Reserve a port for your service.
  6. s.bind((host, port))        # Bind to the port

  7. s.listen(5)                 # Now wait for client connection.
  8. while True:
  9.    c, addr = s.accept()     # Establish connection with client.
  10.    print 'Got connection from', addr
  11.    c.send('Thank you for connecting')
  12.    c.close()                # Close the connection
复制代码

  1. # -*- utf-8 -*-

  2. import urlparse
  3. import datetime
  4. import os
  5. from multiprocessing import Process,Queue,Array,RLock

  6. """
  7. 多进程分块读取文件
  8. """

  9. WORKERS = 8
  10. BLOCKSIZE = 2000000
  11. FSIZE = 0

  12. def getFilesize(file):
  13.     """
  14.         获取文件的大小
  15.     """
  16.     global FILE_SIZE
  17.     fstream = open(file,'r')
  18.     fstream.seek(0,os.SEEK_END)
  19.     FILE_SIZE = fstream.tell()
  20.     fstream.close()

  21. def process_found(pid,array,file,rlock):
  22.     global FSIZE
  23.     global JOB
  24.     global PREFIX
  25.     """
  26.         进程处理
  27.         Args:
  28.             pid:进程编号
  29.             array:进程间共享队列,用于标记各进程所读的文件块结束位置
  30.             file:所读文件名称
  31.         各个进程先从array中获取当前最大的值为起始位置startpossition
  32.         结束的位置
  33.        endpossition (startpossition+BLOCKSIZE) if (startpossition+BLOCKSIZE)<FILE_SIZE else FILE_SIZE
  34.         if startpossition==FILE_SIZE则进程结束
  35.         if startpossition==0则从0开始读取
  36.         if startpossition!=0为防止行被block截断的情况,先读一行不处理,从下一行开始正式处理
  37.         if 当前位置 <=endpossition 就readline
  38.         否则越过边界,就从新查找array中的最大值
  39.     """
  40.     fstream = open(file,'r')
  41.      
  42.     while True:
  43.         rlock.acquire()
  44.         print 'pid%s'%pid,','.join([str(v) for v in array])
  45.         startpossition = max(array)           
  46.         endpossition = array[pid] = (startpossition+BLOCKSIZE) if (startpossition+BLOCKSIZE)<FILE_SIZE else FILE_SIZE
  47.         rlock.release()
  48.          
  49.         if startpossition == FSIZE:#end of the file
  50.             print 'pid%s end'%(pid)
  51.             break
  52.         elif startpossition !=0:
  53.             fstream.seek(startpossition)
  54.             fstream.readline()
  55.         pos = ss = fstream.tell()
  56.         ostream = open('/test/down/tmp_pid'+str(pid)+'_jobs'+str(endpossition),'w')
  57.         while pos<endpossition:
  58.             #处理
  59.             line = fstream.readline()                       
  60.             ostream.write(line)
  61.             pos = fstream.tell()

  62.         print 'pid:%s,startposition:%s,endposition:%s,pos:%s'%(pid,ss,pos,pos)
  63.         ostream.flush()
  64.         ostream.close()
  65.         ee = fstream.tell()      

  66.     fstream.close()

  67. def main():
  68.     global FILE_SIZE
  69.     print datetime.datetime.now().strftime("%Y/%d/%m %H:%M:%S")
  70.      
  71.     file = "/test/download/exampl/access_nginx.log"
  72.     getFilesize(file)
  73.     print FSIZE
  74.      
  75.     rlock = RLock()
  76.     array = Array('l',WORKERS,lock=rlock)
  77.     threads=[]
  78.     for i in range(WORKERS):
  79.         p=Process(target=process_found, args=[i,array,file,rlock])
  80.         threads.append(p)

  81.     for i in range(WORKERS):
  82.         threads[i].start()
  83.      
  84.     for i in range(WORKERS):
  85.         threads[i].join()

  86.     print datetime.datetime.now().strftime("%Y/%d/%m %H:%M:%S")

  87. if __name__ == '__main__':
  88.     main()
复制代码

求职 : 系统工程师等
论坛徽章:
5
技术图书徽章
日期:2014-04-19 22:01:05天蝎座
日期:2014-05-09 13:49:28双子座
日期:2014-06-16 15:08:042015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:55:28
发表于 2015-01-08 11:36 |显示全部楼层
本帖最后由 qxhgd 于 2015-01-13 11:19 编辑

1.说说你对TCP/IP协议的了解有多少。
   深入研读过《深入linux网络技术内幕》《tcp ip详解》,对协议栈的实现有深入的认识;
   开发的产品,与路由器类似,因此对各种协议如ipv4、ipv6、tcp、udp、ftp、dhcp、pppoe、dns、dslite、6rd等都比较熟悉;

2.说说你对Python基础知识的了解有多少。
   学习过两本python入门的书籍,对python的语法、函数式编程等比较熟悉;
   可以使用python写些简单程序,如网络爬虫、邮件相关、socket相关、读写文件、模拟浏览器登录等;
   近期准备在python的网络编程上发力。

3.说说你读完本章节后的感谢。(图书链接在下方)
书写的很好,尤其是原理与实际的编码演练相结合,很多代码可以直接使用,
相信本书可以带领python爱好者进入python网络编程的殿堂;
另外,本人近期有向互联网方向转的意向,希望本书可以助我一臂之力!

4.请给出一段跟网络编程相关的Python代码并简单说明一下它的功能。
   下面这段代码的功能是发送一个封邮件,标题是“python email test”,内容是“你好”。
  1. #!/usr/bin/env python3  
  2. #coding: utf-8  
  3. import smtplib  
  4. from email.mime.text import MIMEText  
  5. from email.header import Header  
  6.   
  7. sender = '***'  
  8. receiver = '***'  
  9. subject = 'python email test'  
  10. smtpserver = 'smtp.163.com'  
  11. username = '***'  
  12. password = '***'  
  13.   
  14. msg = MIMEText('你好','text','utf-8')#中文需参数‘utf-8’,单字节字符不需要  
  15. msg['Subject'] = Header(subject, 'utf-8')  
  16.   
  17. smtp = smtplib.SMTP()  
  18. smtp.connect('smtp.163.com')  
  19. smtp.login(username, password)  
  20. smtp.sendmail(sender, receiver, msg.as_string())  
  21. smtp.quit()  
复制代码
非常感谢!

论坛徽章:
0
发表于 2015-01-08 20:18 |显示全部楼层
1.说说你对TCP/IP协议的了解有多少。
    我对tcp/ip的了解主要通过 http协议分析来的。因为在做一些网络安全的工作。需要进行Http协议的分析,
以及对构成http 协议的底层tcp/ip协议要了解。特别是进行数据转发,ip路由选路,修改ip包的地址.TCP协议里
因为只是接触了SOCKET通信,建立一个代理服务器,可以做为中间人,话说http协议一点不安全,Https有
优点。

2.说说你对Python基础知识的了解有多少。
    现在的工作都是用python来完成的,所以基础是有的,呵呵。做的很杂,pyQt 做过,
web框架django等也做过,现在接触http协议较多。

3.说说你读完本章节后的感谢。(图书链接在下方)
    以前看过《python网络编程》。看了本书的目录感到比较实用,作者的写作态度较好,很认真。
    希望得到这本书,哈哈
4.请给出一段跟网络编程相关的Python代码并简单说明一下它的功能。
实现一个简单的http代理服务器
  1. #-*- coding: UTF-8 -*-
  2. import socket,select
  3. import sys
  4. import thread
  5. from multiprocessing import Process
  6. class Proxy:
  7.     def __init__(self,client):
  8.         self.client=client
  9.         self.target=None
  10.         self.request_url=None
  11.         self.BUFSIZE=4096
  12.         self.method=None
  13.         self.targetHost=None
  14.     def getClientRequest(self):
  15.         request=self.client.recv(self.BUFSIZE)
  16.         if not request:
  17.             return None
  18.         cn=request.find('\n')
  19.         firstLine=request[:cn]
  20.         #print firstLine[:len(firstLine)-9]
  21.         line=firstLine.split()
  22.         self.method=line[0]
  23.         self.targetHost=line[1]
  24.         return request
  25.     def commonMethod(self,request):
  26.         tmp=self.targetHost.split('/')
  27.         net=tmp[0]+'//'+tmp[2]
  28.         request=request.replace(net,'')
  29.         targetAddr=self.getTargetInfo(tmp[2])
  30.         try:
  31.             (fam,_,_,_,addr)=socket.getaddrinfo(targetAddr[0],targetAddr[1])[0]
  32.         except Exception as e:
  33.             print e
  34.             return
  35.         self.target=socket.socket(fam)
  36.         self.target.connect(addr)
  37.         self.target.send(request)
  38.         self.nonblocking()
  39.     def connectMethod(self,request): #对于CONNECT处理可以添加在这里
  40.         pass
  41.     def run(self):
  42.         request=self.getClientRequest()
  43.         if request:
  44.             if self.method in ['GET','POST','PUT',"DELETE",'HAVE']:
  45.                 self.commonMethod(request)
  46.             elif self.method=='CONNECT':
  47.                 self.connectMethod(request)
  48.     def nonblocking(self):
  49.         inputs=[self.client,self.target]
  50.         while True:
  51.             readable,writeable,errs=select.select(inputs,[],inputs,3)
  52.             if errs:
  53.                 break
  54.             for soc in readable:
  55.                 data=soc.recv(self.BUFSIZE)
  56.                 if data:
  57.                     if soc is self.client:
  58.                         self.target.send(data)
  59.                     elif soc is self.target:
  60.                         self.client.send(data)
  61.                 else:
  62.                     break
  63.         self.client.close()
  64.         self.target.close()
  65.     def getTargetInfo(self,host):
  66.         port=0
  67.         site=None
  68.         if ':' in host:
  69.             tmp=host.split(':')
  70.             site=tmp[0]
  71.             port=int(tmp[1])
  72.         else:
  73.             site=host
  74.             port=80
  75.         return site,port

  76. class ProxyServer:
  77.     def __init__(self,host,port):
  78.         self.host=host
  79.         self.port=port
  80.         self.server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  81.         self.server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
  82.     def run(self):
  83.         self.server.bind((host,port))
  84.         self.server.listen(5)
  85.         while True:
  86.             client,_=self.server.accept()
  87.             thread.start_new_thread(Proxy(client).run,())
  88.             # p=Process(target=Proxy(server).run, args=()) #多进程
  89.             # p.start()
  90. if __name__=='__main__':      
  91.     host = '0.0.0.0'
  92.     port = 8088
  93.     print 'proxy server is  starting at',host,':',port
  94.     ProxyServer(host,port).run()
  95.    
  96.    
  97.    
  98.         
复制代码

论坛徽章:
0
发表于 2015-01-09 10:56 |显示全部楼层
1.说说你对TCP/IP协议的了解有多少。
   
之前做过网络爬虫和im即时通信系统,对tcp/ip有过一段学习,tcp/ip协议栈可以说是互联网的基础吧,整个协议栈非常庞大,对于之前的使用和学习而言,网络爬虫主要是使用应用层上的http协议,需要把http协议的请求响应机制理解好,session,cookies的原理实现。而即时通信系统使用的是tcp/udp协议,tcp实现心跳机制服务器与客户端的长连接,udp协议不保证连接可靠性,用作即时语音协议。


2.说说你对Python基础知识的了解有多少。
   
Python语言是一门脚本语言,具有非常简捷而清晰的语法特点,上手非常快,适合完成各种高层任务,例如网络爬虫,网站开发等。Python的很多功能都是以扩展模块的形式提供的。Python的内核很小巧,语法简单,很容易学习;Python强调代码的可读性,以缩排的方式省去冗余,代码给人的感觉很清爽、美观,python比java等编译型语言节约一半的代码量。但是Python运行时要做动态的类型检查,运行效率不如编译型语言。


3.说说你读完本章节后的感想。
   
看了试读章节,书上主要讲了python在开发应用层面的各种示例,适合python开发者学习,所有的示例都是与各种网络协议关联,基本上囊括了互联网大部分应用场景,可以帮助python开发者迅速掌握到各种实例的制作思路和方法。总体来说对python初学者是非常好也适合的一本书。


4.请给出一段跟网络编程相关的Python代码并简单说明一下它的功能。
下面是一段爬取视频真事地址的案例:
  1. import sys
  2. import os
  3. import time
  4. import urllib2
  5. import cStringIO, gzip
  6. import lxml.html
  7. import re
  8. import json
  9. import random

  10. def createRequest(url, referer = None):
  11.     req = urllib2.Request(
  12.         urllib2.quote(url.split('#')[0].encode('utf8'), safe = "%/:=&?~#+!$,;'@()*[]"),
  13.         headers = {"Accept": "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5",
  14.                    "Accept-Charset": "GBK,utf-8;q=0.7,*;q=0.3",
  15.                    "Accept-Encoding": "gzip",
  16.                    "Accept-Language": "zh-CN,zh;q=0.8",
  17.                    "Cache-Control": "max-age=0",
  18.                    "Connection": "keep-alive",
  19.                    "User-Agent": "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.106 Safari/535.2",
  20.         })
  21.      
  22.     if referer is not None:
  23.         req.add_header('Referer', referer)
  24.     return req

  25. def getContent(url, referer = None):
  26.     f = urllib2.urlopen(createRequest(url, referer), timeout = 15)
  27.     data = f.read()
  28.     if data[:6] == '\x1f\x8b\x08\x00\x00\x00':
  29.         data = gzip.GzipFile(fileobj = cStringIO.StringIO(data)).read()
  30.     f.close()
  31.      
  32.     return data

  33. def getCdnUrl(apiUrl, referer = None):
  34.     content = getContent(apiUrl, referer)
  35.     data = json.loads(content)
  36.     token = data['token']
  37.     for resource in data['fsps']:
  38.         fspUrl = resource['url']
  39.         if resource['clarity'] == 'super-dvd':
  40.             fspUrl = resource['url']

  41.     fsp = re.findall("fsp://(\w+)", fspUrl)[0]
  42.     if fsp == '':
  43.         return None
  44.     else:
  45.         timestamp = int(time.time())
  46.         cdnUrl = ''.format(fsp, timestamp, token)
  47.         return cdnUrl

  48. def getPlayUrl(cdnUrl, referer = None):
  49.     content = getContent(cdnUrl, referer)
  50.     data = json.loads(content)
  51.     if data['return'] == 'succ':
  52.         playUrls = data['playlist'][0]['urls']
  53.         return playUrls[random.randint(0, len(playUrls)-1)]
  54.     return None

  55. if __name__ == '__main__':
  56.     if len(sys.argv) < 2 or sys.argv[1].startswith('http') is None:
  57.         print 'Usage: python '
  58.         print 'Please input the url to be parse'
  59.         sys.exit()

  60.     videoUrl = sys.argv[1]
  61.     vid = int(re.findall("vplay/m-(\d+)", videoUrl)[0])
  62.     apiUrl = ''.format(vid)
  63.     cdnUrl = getCdnUrl(apiUrl, videoUrl)
  64.     playUrl = getPlayUrl(cdnUrl, videoUrl)
  65.     print playUrl
复制代码

论坛徽章:
0
发表于 2015-01-10 22:58 |显示全部楼层
1.说说你对TCP/IP协议的了解有多少。
移动通信行业工作多年,熟悉TCP/IP协议栈,多年TCP/IP开发测试经验。使用过TCP/UDP/RAW三种基本socket。

2.说说你对Python基础知识的了解有多少。
不多,用python做过一些文件处理工作,主要用于分析wireshark抓包文件中的报文,如找出重复报文,分析报文延时等。

3.说说你读完本章节后的感谢。(图书链接在下方)
本书看起来比较务实,应该能作为平常工作中的手册书。

4.请给出一段跟网络编程相关的Python代码并简单说明一下它的功能。
srv.py:
from socket import *
host = ''
port = 15926
addr = (host, port)
bufsize = 1500
s = socket(AF_INET, SOCK_DGRAM)
s.bind(addr)

while True:
        data, addr2 = s.recvfrom(bufsize)
        print data
        s.sendto(data, addr2)
s.close()

cli.py:
from socket import *
host = '127.0.0.1'
port = 15926
addr = (host, port)
bufsize = 1500
s = socket(AF_INET, SOCK_DGRAM)

while True:
        data = raw_input('> ')
        if not data:
                break
        s.sendto(data, addr)
        data2, addr2 = s.recvfrom(bufsize)
        print data2
s.close()

最基本的python客户端服务器程序,客户端输入一串字符,发给服务器,服务器收到后打印并发回客户端,客户端再回显。

论坛徽章:
0
发表于 2015-01-11 17:05 |显示全部楼层
本帖最后由 欧利斯基 于 2015-01-11 17:05 编辑



论坛徽章:
0
发表于 2015-01-12 11:00 |显示全部楼层
回复 10# groundsea

你是怎么把python 跟wireshark结合在一起用的? 如何分析数据包呢?
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP