当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python socket.socket.recvmsg用法及代码示例


用法:

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

从套接字接收正常数据(最多 bufsize 字节)和辅助数据。 ancbufsize 参数设置用于接收辅助数据的内部缓冲区的大小(以字节为单位);它默认为 0,这意味着不会接收到辅助数据。可以使用 CMSG_SPACE()CMSG_LEN() 计算辅助数据的适当缓冲区大小,不适合缓冲区的项目可能会被截断或丢弃。 flags 参数默认为 0,其含义与 recv() 相同。

返回值是一个 4 元组:(data, ancdata, msg_flags, address)data 项目是一个 bytes 对象,用于保存接收到的非辅助数据。 ancdata 项是零个或多个元组的列表 (cmsg_level, cmsg_type, cmsg_data) 表示接收到的辅助数据(控制消息):cmsg_levelcmsg_type 是分别指定协议级别和协议特定类型的整数,而 cmsg_data是一个保存相关数据的bytes 对象。 msg_flags 项是表示接收消息条件的各种标志的按位或;有关详细信息,请参阅您的系统文档。如果接收套接字未连接,address是发送套接字的地址,如果有的话;否则,它的值是未指定的。

在某些系统上,socket.socket.sendmsgsocket.socket.recvmsg可用于在进程之间通过AF_UNIX插座。使用此设施时(通常仅限于SOCK_STREAM插座),socket.socket.recvmsg将在其辅助数据中返回表单项(socket.SOL_SOCKET, socket.SCM_RIGHTS, fds),其中fds是一个bytes将新文件说明符表示为原生 C 的二进制数组的对象int类型。如果socket.socket.recvmsg在系统调用返回后引发异常,它将首先尝试关闭通过此机制接收到的任何文件说明符。

一些系统不指示仅部分接收的辅助数据项的截断长度。如果一个项目似乎超出了缓冲区的末尾,recvmsg() 将发出 RuntimeWarning ,并将返回它在缓冲区内的部分,前提是它在相关数据开始之前没有被截断。

在支持SCM_RIGHTS 机制的系统上,以下函数将接收最多maxfds 文件说明符,返回消息数据和包含说明符的列表(同时忽略意外情况,例如收到不相关的控制消息)。另见sendmsg()

import socket, array

def recv_fds(sock, msglen, maxfds):
    fds = array.array("i")   # Array of ints
    msg, ancdata, flags, addr = sock.recvmsg(msglen, socket.CMSG_LEN(maxfds * fds.itemsize))
    for cmsg_level, cmsg_type, cmsg_data in ancdata:
        if cmsg_level == socket.SOL_SOCKET and cmsg_type == socket.SCM_RIGHTS:
            # Append data, ignoring any truncated integers at the end.
            fds.frombytes(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
    return msg, list(fds)

可用性:大多数 Unix 平台,可能还有其他平台。

3.3 版中的新函数。

在 3.5 版中更改:如果系统调用被中断并且信号处理程序没有引发异常,则该方法现在重试系统调用而不是引发InterruptedError例外(见PEP 475理由)。

相关用法


注:本文由纯净天空筛选整理自python.org大神的英文原创作品 socket.socket.recvmsg。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。