1 # Copyright (c) Twisted Matrix Laboratories.
2 # See LICENSE for details.
5 def recv(long s, object bufflist, object obj, unsigned long flags = 0):
9 cdef unsigned long bytes
10 cdef PyObject **buffers
11 cdef Py_ssize_t i, size, buffcount
13 bufflist = PySequence_Fast(bufflist, 'second argument needs to be a list')
14 buffcount = PySequence_Fast_GET_SIZE(bufflist)
15 buffers = PySequence_Fast_ITEMS(bufflist)
17 ws_buf = <WSABUF *>PyMem_Malloc(buffcount*sizeof(WSABUF))
20 for i from 0 <= i < buffcount:
21 PyObject_AsWriteBuffer(<object>buffers[i], <void **>&ws_buf[i].buf, &size)
22 ws_buf[i].len = <DWORD>size
26 ov.obj = <PyObject *>obj
28 rc = WSARecv(s, ws_buf, <DWORD>buffcount, &bytes, &flags, <OVERLAPPED *>ov, NULL)
30 if rc == SOCKET_ERROR:
31 rc = WSAGetLastError()
32 if rc != ERROR_IO_PENDING:
41 def recvfrom(long s, object buff, object addr_buff, object addr_len_buff, object obj, unsigned long flags = 0):
42 cdef int rc, c_addr_buff_len, c_addr_len_buff_len
45 cdef unsigned long bytes
46 cdef sockaddr *c_addr_buff
47 cdef int *c_addr_len_buff
50 PyObject_AsWriteBuffer(buff, <void **>&ws_buf.buf, &size)
51 ws_buf.len = <DWORD>size
52 PyObject_AsWriteBuffer(addr_buff, <void **>&c_addr_buff, &size)
53 c_addr_buff_len = <int>size
54 PyObject_AsWriteBuffer(addr_len_buff, <void **>&c_addr_len_buff, &size)
55 c_addr_len_buff_len = <int>size
57 if c_addr_len_buff_len != sizeof(int):
58 raise ValueError, 'length of address length buffer needs to be sizeof(int)'
60 c_addr_len_buff[0] = c_addr_buff_len
64 ov.obj = <PyObject *>obj
66 rc = WSARecvFrom(s, &ws_buf, 1, &bytes, &flags, c_addr_buff, c_addr_len_buff, <OVERLAPPED *>ov, NULL)
68 if rc == SOCKET_ERROR:
69 rc = WSAGetLastError()
70 if rc != ERROR_IO_PENDING: