python剑指网络篇一

#coding:utf-8
__author__ = ‘similarface‘
#!/usr/bin/env python

import socket
#二进制和ASCII互转及其它进制转换
from binascii import hexlify
def get_remote_machine_info(remote_host):
    ‘‘‘
    获取根据域名获取IP地址
    :param remote_host: 域名
    :return:IP地址
    ‘‘‘
    try:
        #SimilarFacedeMacBook-Pro:~ similarface$ ping www.python.org
        #PING python.map.fastly.net (103.245.222.223): 56 data bytes
        print("%s的IP地址:%s" %(remote_host,socket.gethostbyname(remote_host)))
    except socket.error,err_msg:
        print("%s: %s" %(remote_host,err_msg))

def convert_ip4_address():
    ‘‘‘
    转化IP地址
    ‘‘‘
    for ip_addr in [‘127.0.0.1‘,‘192.168.0.1‘]:
        #IP地址转换为一个32位的网络序列IP地址。
        packed_ip_addr=socket.inet_aton(ip_addr)
        #将一个十进制网络字节序转换为点分十进制IP格式的字符串。
        unpacked_ip_addr=socket.inet_ntoa(packed_ip_addr)
        print "IP地址: %s => 打包: %s, 非打包: %s" %(ip_addr, hexlify(packed_ip_addr), unpacked_ip_addr)

def find_service_name():
    ‘‘‘
    根据端口获取服务的名称
    :return:
    ‘‘‘
    protocolname=‘tcp‘
    for port in range(53,22,80):
        try:
            print "Port: %s => service name: %s" %(port, socket.getservbyport(port, protocolname))
        except Exception,e:
            print(e)

    print "Port: %s => service name: %s" %(53, socket.getservbyport(53, ‘udp‘))

def convert_integer():
    ‘‘‘
    #ntohl()是将一个无符号长整形数从网络字节顺序转换为主机字节顺序。
    #将主机数转换成无符号长整型的网络字节顺序。本函数将一个32位数从主机字节顺序转换成网络字节顺序。
    :return:
    ‘‘‘
    data=1234
    print "原数据: %s => 长主机字节顺序: %s, 长网络字节顺序: %s"%(data, socket.ntohl(data), socket.htonl(data))
    print "原数据: %s => 短主机字节顺序: %s, 短网络字节顺序: %s"%(data, socket.ntohs(data), socket.htons(data))

def test_socket_timeout():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    print "默认的超时时间: %s" %s.gettimeout()
    s.settimeout(100)
    print "当前的超时时间: %s" %s.gettimeout()

import sys,socket,argparse
def main():
    parser=argparse.ArgumentParser(description="Socket 异常处理")
    parser.add_argument(‘--host‘,action=‘store‘,dest=‘host‘,required=False)
    parser.add_argument(‘--port‘,action="store",desc=‘port‘,type=int,required=False)
    parser.add_argument(‘--file‘,action-"store",desc=‘file‘,required=False)
    given_args=parser.parse_args()
    host=given_args.host
    port=given_args.port
    filename=given_args.file

    try:
        s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    except socket.error,e:
        print("Error creating socket: %s" % e )
        sys.exit(1)

    try:
        s.connect((host,port))
    except socket.gaierror,e:
        print "Address-related error connecting to server: %s" % e
        sys.exit(1)
    except socket.error,e:
        print "Connection error: %s" % e
        sys.exit(1)

    try:
        s.sendall("GET %s HTTP/1.0\r\n\r\n" % filename)
    except socket.error, e:
        print "Error sending data: %s" % e
        sys.exit(1)

    while 1:
        try:
            buf = s.recv(2048)
        except socket.error, e:
            print "Error receiving data: %s" % e
            sys.exit(1)
        if not len(buf):
            break
           # write the received data
        sys.stdout.write(buf)

if __name__ == "__main__":
    remote_host=‘www.python.org‘
    get_remote_machine_info(remote_host)
    convert_ip4_address()
    print(‘------find_service_name------‘)
    find_service_name()
    print(‘------convert_integer------‘)
    convert_integer()
    print(‘------main------‘)
    main()

  

时间: 2024-10-28 07:35:16

python剑指网络篇一的相关文章

python剑指网络

>>> #获取hostname ... >>> host_name=socket.gethostname() >>> print "%s" %host_name SimilarFacedeMacBook-Pro.local >>> #获取IP地址 ... >>> socket.gethostbyname(host_name) '192.168.30.120' #获取远程机器的IP,类型于ping

python剑指offer 合并两个排序的链表

题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. # -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: # 返回合并后列表 def Merge(self, pHead1, pHead2): # write code here if pHead1 == None: re

python剑指offer 实现树的子结构

题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) # -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def HasSubtree(self, pRoot1, pRoot2): # write code here if not

python剑指offer系列二叉树中和为某一值的路径

题目描述 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大的数组靠前) # -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: # 返回二维列

python剑指offer数组中出现次数超过一半的数字

题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果不存在则输出0. 思路: 两种思路.第一种思路,出现次数超过一半的数字,不管如何,必然这个数字位于数组中间的位置,因此可以采用类似于快排的划分的方法,找到位于数组中间的位置的数字,然后在顺序检索是否这个数字出现次数超过一半.第二种思路根据数组的特点,出现次数超过一半的数,他出现的次数比其他数字出

python剑指offer最小的K个数

题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 思路: 使用快排中的partition思想. ①我们设定partition函数的哨兵为key=lists[left],在partition函数中完成一轮比较的结果是,比key大的数都在其右边,比key小的数放在其左边.完成该轮后返回其left=right时left的值. ②我们判断left的值是比k大还是小: 如果left的值比k大,说明上轮partition之

一起来刷《剑指Offer》——不修改数组找出重复的数字(思路及Python实现)

数组中重复的数字 在上一篇博客中<剑指Offer>-- 题目一:找出数组中重复的数字(Python多种方法实现)中,其实能发现这类题目的关键就是一边遍历数组一边查满足条件的元素. 然后我们在博客用最复杂的方式学会数组(Python实现动态数组)这篇博客中介绍了数组这一结构的本质,并自己动手实现了一个动态数组. 今天我们介绍一下另一道来自<剑指Offer>的关于数组的面试题--不修改数组找出重复的数字. 不修改数组找出重复的数字 题目二:不修改数组找出重复的数字 给定一个长度为 n+

【剑指offer】Q32:从1到n整数1出现的次数(python)

def q32(n, len): if n < 0: return 0 elif n <= 1: return n total = 0 while n > 0: if n >= 1 and n < 10: total += 1 return total p1 = n % (10**(len - 1)) h = n / (10**(len - 1)) p2 = p1 + 1 n = p1 if h > 1: total += 10**(len - 1) else: tot

【剑指offer】【python】面试题2~5

使用python实现<剑指offer>面试题ヾ(?°∇°?)??,以此记录. 2_实现Singleton模式 题目:实现单例模式 单例模式,是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中,应用该模式的一个类只有一个实例.即一个类只有一个对象实例. 原理:使用模块时,第一次导入会生成.pyc文件(存放相应目录下的__pycache__文件夹内),当第二次使用该模块时会直接加载pyc文件.所以,将函数.数据等定义在一个模块中即可完成一个单例对象.