IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]15.1 socket--网络接口库

    caimouse发表于 2016-07-04 09:01:23
    love 0

    15. 进程间通讯与网络库

    本库主要提供了不同进程之间通讯,以及不同网络之间的进程通讯。

    15.1 socket--网络接口库

    本模块提供了BSD类似的socket网络接口库,它可以使用在Unix、Windows、MacOS等系统平台上。

    exception socket.herror

    地址相关错误的异常。

     

    exception socket.gaierror

    调用函数getaddrinfo()或getnameinfo()出错抛出异常。

     

    exception socket.timeout

    当一个socket超时抛出的异常。

     

    socket.AF_UNIX

    socket.AF_INET

    socket.AF_INET6

    表示网络地址类型。

     

    socket.SOCK_STREAM

    socket.SOCK_DGRAM

    socket.SOCK_RAW

    socket.SOCK_RDM

    socket.SOCK_SEQPACKET

    socket的类型。

     

    socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)

    创建一个socket实例。参数family是socket地址类型;参数type是TCP还是UDP等类型;参数proto是协议版本号。

     

    socket.socketpair([family[, type[, proto]]])

    创建一对相互通讯的socket对象,仅用于Unix。

     

    socket.create_connection(address[, timeout[, source_address]])

    创建一个连接到指定服务器的socket对象。参数address是(主机, 端口)元组;参数timeout是连接超时时间;参数source_address是指定绑定的客户端的地址和端口。

     

    socket.fromfd(fd, family, type, proto=0)

    从一个文件描述fd来创建一个socket对象。

     

    socket.fromshare(data)

    从指定的数据data里创建一个socket对象,仅用于Windows。

     

    socket.SocketType

    Python表示socket的类型。

     

    socket.getaddrinfo(host, port, family=0, type=0, proto=0, flags=0)

    通过名称获取地址信息,返回5个元组(family, type, proto, canonname, sockaddr)的地址信息,可以用于连接服务器。

     

    socket.getfqdn([name])

    查询给出名称的域名称。

     

    socket.gethostbyname(hostname)

    把主机名称转换为IPv4地址格式。

     

    socket.gethostbyname_ex(hostname)

    使用扩展的方式把主机名称转换为IPv4地址格式。

     

    socket.gethostname()

    返回字符串表示的主机名称。

     

    socket.gethostbyaddr(ip_address)

    通过地址来获取主机名称,返回三元组的信息。

     

    socket.getnameinfo(sockaddr, flags)

    把socket地址转换为两元素的元组(主机,端口)。

     

    socket.getprotobyname(protocolname)

    通过协议名称来获取合适参数给socket()函数使用。

     

    socket.getservbyname(servicename[, protocolname])

    从服务名称和协议名称转换为合适的端口。

     

    socket.getservbyport(port[, protocolname])

    从端口转换为服务名称。

     

    socket.ntohl(x)

    转换32位网络顺序数据到主机顺序。

     

    socket.ntohs(x)

    转换16位网络顺序数据到主机顺序。

     

    socket.htonl(x)

    转换32位主机顺序数据到网络顺序。

     

    socket.htons(x)

    转换16位主机顺序数据到网络顺序。

     

    socket.inet_aton(ip_string)

    把字符串表示的IP地址转换为32位二进制表示。

     

    socket.inet_ntoa(packed_ip)

    把32位表示的IPv4地址转换为字符串表示的IP地址。

     

    socket.inet_pton(address_family, ip_string)

    从特定网络字符串表示的地址转换为二进制表示的地址。

     

    socket.inet_ntop(address_family, packed_ip)

    从特定网络二进制表示的地址转换为字符串表示的地址。

     

    socket.CMSG_LEN(length)

    返回总数据的长度。仅用于Unix。

     

    socket.CMSG_SPACE(length)

    返回recvmsg()函数接收数据缓冲区的大小。仅用Unix。

     

    socket.getdefaulttimeout()

    返回本模块默认的超时时间。

     

    socket.setdefaulttimeout(timeout)

    设置本模块的超时时间。

     

    socket.sethostname(name)

    设置主机的名称。仅用于Unix。

     

    socket.if_nameindex()

    返回网络接口信息的列表。仅用于Unix。

     

    socket.if_nametoindex(if_name)

    返回网络接口名称对应的接口索引值。仅用于Unix。

     

    socket.accept()

    接收一个连接。返回元组(连接, 地址)。

     

    socket.bind(address)

    绑定socket对象到指定地址。

     

    socket.close()

    标记socket对象已经关闭。

     

    socket.connect(address)

    连接到远程的服务器地址。

     

    socket.connect_ex(address)

    连接到远程的服务器地址,返回一个错误,不产生异常。

     

    socket.detach()

    关闭socket对象,但文件描述符还是有效的。

     

    socket.dup()

    复制一个socket对象。

     

    socket.fileno()

    返回一个socket对象的文件描述数字。

     

    socket.get_inheritable()

    如果能被子进程继承的,返回True。

     

    socket.getpeername()

    返回已经连接远端的地址。

     

    socket.getsockname()

    返回本地的地址。

     

    socket.getsockopt(level, optname[, buflen])

    返回socket设置的选项的值。

     

    socket.gettimeout()

    返回socket对象相关的超时时间。

     

    socket.ioctl(control, option)

    设置socket对象控制参数。仅用于Windows。

     

    socket.listen(backlog)

    服务器监听连接进来。参数backlog是指明接收连接的队列大小。

     

    socket.makefile(mode='r', buffering=None, *, encoding=None, errors=None, newline=None)

    绑定一个文件对象到socket对象。

     

    socket.recv(bufsize[, flags])

    从socket对象接收数据,返回包括数据bytes对象。

     

    socket.recvfrom(bufsize[, flags])

    从socket对象接收数据,返回元组(数据对象,地址)。

     

    socket.recvmsg(bufsize[, ancbufsize[, flags]])

    从socket对象接收数据和辅助数据。仅用于Unix。

     

    socket.recvmsg_into(buffers[, ancbufsize[, flags]])

    与函数recvmsg类似,不过它把数据和辅助数据都放到缓冲区。仅用于Unix。

     

    socket.recvfrom_into(buffer[, nbytes[, flags]])

    从socket对象接收数据到缓冲区,不创建新数据对象。

     

    socket.recv_into(buffer[, nbytes[, flags]])

    接收数据到指定缓冲区,不创建新数据对象返回。

     

    socket.send(bytes[, flags])

    把数据发送给socket对象。

     

    socket.sendall(bytes[, flags])

    连续地发送所有数据,或者遇到异常才返回。

     

    socket.sendto(bytes, address)

    socket.sendto(bytes, flags, address)

    发送数据到指定地址,一般使用在无连接的socket。

     

    socket.sendmsg(buffers[, ancdata[, flags[, address]]])

    发送消息和辅助数据到socket对象。仅用于Unix。

     

    socket.set_inheritable(inheritable)

    设置socket对象可继承。

     

    socket.setblocking(flag)

    设置socket为阻塞,还是非阻塞状态。

     

    socket.settimeout(value)

    对阻塞的socket设置阻塞的超时时间。

     

    socket.setsockopt(level, optname, value)

    设置socket对象的可选项参数。

     

    socket.shutdown(how)

    发送socket关闭信号包给对方。

     

    socket.share(process_id)

    复制一个socket对象,并共享给目标进程。

     

    socket.family

    socket的网络分类。

     

    socket.type

    socket对象类型。

     

    socket.proto

    socket对象网络协议。

     

    创建一个简单TCP服务器的例子:

    #python 3.4
    import socket
     
    HOST = ''                 
    PORT = 50007              
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((HOST, PORT))
    s.listen(1)
    conn, addr = s.accept()
    print('Connected by', addr)
    while True:
        data = conn.recv(1024)
        if not data: break
        conn.sendall(data)
    conn.close()


    在这个例子里,指定主机名称为空,端口为50007,然后调用函数socket()来创建一个socket对象,接着调用函数bind()绑定,调用函数listen()监听连接,调用函数accept()来接收连接进来并创建一个socket对象,然后与这个对象进行通讯,调用函数recv()接收数据,再通过函数sendall()发送数据回去。

     

    创建TCP客户端的例子:

    #python 3.4
    import socket
     
    HOST = '127.0.0.1'        # The remote host
    PORT = 50007              # The same port as used by the server
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((HOST, PORT))
    s.sendall(b'Hello, world')
    data = s.recv(1024)
    s.close()
    print('Received', repr(data))


    在这个例子里,指定连接本地IP地址127.0.0.1,服务器的端口为50007,调用函数socket()函数一个socket对象,调用函数connect()连接服务器,调用函数sendall()发送数据,接着调用函数recv()来接收服务器发送回来的数据,最后调用函数close()关闭socket对象。



    蔡军生  QQ:9073204  深圳



沪ICP备19023445号-2号
友情链接