當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。