我正在尝试在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时会发生什么?希望我很清楚......
谢谢, 巴拉
答案 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
开始并按照调用链 - 它或多或少都清晰。