Python 3.3+Linux · macOSsocketфункция
socket.CMSG_SPACE()
дескрипторы и служебные данные
Возвращает размер буфера для recvmsg под элемент служебных данных заданной длины вместе с выравниванием.
Синтаксис
socket.CMSG_SPACE(length) -> int
Это правильная мера для второго аргумента recvmsg: под N дескрипторов нужно CMSG_SPACE(N * размер_int), а под несколько элементов — сумма их CMSG_SPACE. Буфер меньше нужного не даёт ошибки: служебные данные молча обрезаются, ставится флаг MSG_CTRUNC, а лишние дескрипторы пропадают. Есть не на всех Unix-системах.
Примеры
import array, os, socket
a, b = socket.socketpair()
r, w = os.pipe()
fds = array.array('i', [w])
a.sendmsg([b'x'], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, fds)])
msg, anc, flags, addr = b.recvmsg(1, socket.CMSG_SPACE(fds.itemsize))
level, kind, data = anc[0]
got = array.array('i')
got.frombytes(data[:fds.itemsize])
os.write(got[0], b'hi')
print(os.read(r, 2)) # → b'hi'
for fd in (r, w, got[0]):
os.close(fd)
a.close()
b.close()
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности