gpt4 book ai didi

network-programming - 在理解用户空间 send、sendto、sendmsg 到内核空间 sendmsg 的映射方面需要帮助

转载 作者:行者123 更新时间:2023-12-03 12:06:50 25 4
gpt4 key购买 nike

我正在尝试在 Linux 中实现自己的传输层协议(protocol)以进行实验。我将使用套接字接口(interface)并使用 sock_register 添加我的协议(protocol)。对于 proto_ops,我可以看到 sendmsg 和 recvmsg 的参数是(struct kiocb *iocb,struct socket *sock,struct msghdr *msg,size_t len,int flags)。但是用户api的send、sendto、sendmsg有3种。这三个中只有 sendmsg 包含 msghdr 的参数。我发现其他两个 api 与内核提供给我的内核空间 sendmsg 函数的参数不兼容。那么当我们使用 send 和 sendto 用户空间 api 时会发生什么?希望我清楚..

谢谢,
巴拉

最佳答案

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

内核空间接口(interface)略有不同 - 例如。你会得到 kiocb参数 - 但基本思想是相同的。一个 send()sendto()转换为 sendmsg()msghdr指向单个 iovec引用缓冲区。

关于network-programming - 在理解用户空间 send、sendto、sendmsg 到内核空间 sendmsg 的映射方面需要帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3041942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com