python之socket其他api

1. 设置套接字选项和值

官方网址:
https://docs.python.org/3/library/socket.html?highlight=setsockopt#socket.socket.setsockopt

函数定义

socket对象.setsockopt(level, optname, value)
参数说明
  • level:选项所在的协议层

    • SOL_SOCKET:套接字层
    • SOL_IP:ip层
    • SOL_TCP:TCP层
    • SOL_UDP:UDP层
  • optname:选项名
    当level为SOL_SOCKET时,有如下选项

    • SO_BROADCAST      允许发送广播数据,对udp有效 值为0,1(启用)
    • SO_REUSERADDR      允许重用本地地址和端口。启用该设置后,服务器端(执行listen()函数后) 可以多次绑定同一端口号(与操作系统有关)。 值为0,1(启用)
    • SO_DEBUG        允许调试  值为0/1
    • SO_DONTROUTE      禁止通过路由器和网关往外发送信息包。这主要是为了安全而用在以太网上UDP通信的一种方法。不管目的地址使用什么IP地址,都可以防止数据离开本地网络  值为0/1
    • SO_KEEPALIVE      保持连接。可以使TCP通信的信息包保持连续性。这些信息包可以在没有信息传输的时候,使通信的双方确定连接是保持的  值为0/1
    • SO_OOBINLINE      可以把收到的不正常数据看成是正常的数据,也就是说会通过一个标准的对recv()的调用来接收这些数据 值为0/1
    • SO_RCVBUF        接收缓冲区大小  int型值
    • SO_SNDBUF        发送缓冲区大小  int型值
    • SO_RCVLOWAT       接收缓冲区下限  int型值
    • SO_SNDLOWAT       发送缓冲区下限  int型值

    当level为SOL_IP时,有如下选项

    • IP_HDRINCL       在数据包中包含IP首部
    • IP_OPTINOS        IP首部选项     
    • IP_TOS         服务类型
    • IP_TTL         生存时间  

    当level为SOL_TCP时,有如下选项

    • TCP_MAXSEG       TCP最大数据段的大小
    • TCP_NODELAY       不使用Nagle算法

获取套接字选项和值

函数定义

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

获取与套接字相关联的文件对象

返回一个与套接字相关联的文件对象。返回的确切类型取决于给makefile()提供的参数。
套接字必须处于 阻塞模式;
可能有超时,但是如果超时发生,文件对象的内部缓冲区可能会以不一致的状态结束。

关闭返回的文件对象makefile()将不会关闭原始套接字,除非所有其他文件对象已关闭并且 socket.close()已在套接字对象上调用

官方链接:https://docs.python.org/3.6/library/socket.html?highlight=socket#socket.socket.makefile

语法

socket.makefile(mode='r', encoding=None)
参数
  • mode:与open()函数的mode参数相同,’r’(默认)’w’和’b’,只支持二进制模式
  • encoding: 可选,指定编码,如utf-8,省略时采用系统默认编码,windows默认采用GBK编码
返回

返回与套接字相关联的文件对象
可以调用 文件对象 的一些方法,如:readline()

注意:

一般不要调用 读取所有行方法 readlines(),有一些情况,会导致一直读取,比如:当远端程序没有关闭连接时,就会导致一直读取中

例子:

import socket
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(('www.sohu.com',80))

client.send(b'GET / HTTP/1.1\r\n')
client.send(b'Host: www.sohu.com\r\n')
client.sendall(b'User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36\r\n')
client.send(b'\r\n')

fp=client.makefile(mode='r', encoding='utf-8')
line=fp.readline(1024)
print(fp)

获取计算机名

import socket

hostname=socket.gethostname()
print(hostname)

感谢:
https://www.cnblogs.com/xybaby/p/7341579.html


原文出处:/show_1EF3BqD8BiSi.html