Network programming 需要帮助理解用户空间send、sendto、sendmsg到内核空间sendmsg的映射吗
我正在尝试在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时会发生什么呢?希望我说得清楚 谢谢,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与内核提
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);