需要帮助理解用户空间send,sendto,sendmsg到kernel-space sendmsg的映射

时间:2010-06-15 00:57:21

标签: network-programming linux-kernel sockets

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

谢谢, 巴拉

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

假设您对系统调用机制感到满意 - 从net/socket.c开始并按照调用链 - 它或多或少都清晰。

相关问题