send()
реализовано в терминах sendto()
: send(s, buf, len, flags);
эквивалентно sendto(s, buf, len, flags, NULL, 0);
sendto()
в свою очередь реализуется в терминах sendmsg()
. send(s, buf, len, flags, addr, addr_len);
реализуется с помощью (с точки зрения интерфейса пользовательского пространства):
struct iovec iov = {
.iov_base = buf,
.iov_len = len
};
struct msghdr msg = {
.msg_name = addr,
.msg_namelen = addr_len,
.msg_iov = &iov,
.msg_iovlen = 1,
.msg_control = NULL,
.msg_controllen = 0
};
return sendmsg(s, &msg, flags);
Интерфейс пространства ядра немного отличается - например, вы получаете параметр kiocb
- но основная идея та же. send()
или sendto()
преобразуется в sendmsg()
с msghdr
, который указывает на один iovec
, который ссылается на буфер.