Network programming 需要帮助理解用户空间send、sendto、sendmsg到内核空间sendmsg的映射吗

Network programming 需要帮助理解用户空间send、sendto、sendmsg到内核空间sendmsg的映射吗,network-programming,linux-kernel,sockets,Network Programming,Linux Kernel,Sockets,我正在尝试在Linux中实现自己的传输层协议,以便进行一个实验。我将使用socket接口并使用sock\u寄存器添加我的协议。对于proto_ops,我可以看到sendmsg和recvmsg的参数是(struct kiocb*iocb、struct socket*sock、struct msghdr*msg、size_t len、int标志)。但是有三种类型的用户api的send、sendto和sendmsg。在这三个参数中,只有sendmsg包含msghdr的参数。我发现另外两个api与内核提

我正在尝试在Linux中实现自己的传输层协议,以便进行一个实验。我将使用socket接口并使用sock\u寄存器添加我的协议。对于proto_ops,我可以看到sendmsg和recvmsg的参数是(struct kiocb*iocb、struct socket*sock、struct msghdr*msg、size_t len、int标志)。但是有三种类型的用户api的send、sendto和sendmsg。在这三个参数中,只有sendmsg包含msghdr的参数。我发现另外两个api与内核提供给我的内核空间sendmsg函数的参数不兼容。那么,当我们使用send和sendto用户空间api时会发生什么呢?希望我说得清楚

谢谢,
Bala

假设您对系统调用机制感到满意-从调用链开始并遵循调用链-这或多或少是清楚的。

假设您对系统调用机制感到满意-从调用链开始并遵循调用链-这或多或少是清楚的。

send()
是根据
sendto()实现的
发送(s、buf、len、标志)
相当于
sendto(s,buf,len,flags,NULL,0)

sendto()<代码>发送(s、buf、len、标志、地址、地址)通过以下方式实现(就用户空间接口而言):

内核空间接口稍有不同——例如,您得到了
kiocb
参数——但基本思想是相同的。
send()
sendto()
被转换成
sendmsg()
,其中
msghdr
指向引用缓冲区的单个
iovec

send()
根据
sendto()
实现:
send(s、buf、len、flags)
相当于
sendto(s,buf,len,flags,NULL,0)

sendto()<代码>发送(s、buf、len、标志、地址、地址)通过以下方式实现(就用户空间接口而言):

内核空间接口稍有不同——例如,您得到了
kiocb
参数——但基本思想是相同的。将
send()
sendto()
转换为
sendmsg()
,其中
msghdr
指向引用缓冲区的单个
iovec

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);