linux内核中函数tcp_recvmsg的返回值和msg参数之间的关系是什么?

时间:2018-05-20 06:07:11

标签: linux sockets tcp kernel

我想添加一个函数,当TCP上的数据传递给用户空间时做一些事情,所以我在inet_recvmsg()中添加代码,如下所示:

int inet_recvmsg(struct socket *sock, struct msghdr *msg, size_t size, int flags)
{
    struct sock *sk = sock->sk;
    int addr_len = 0;
    int err;
    sock_rps_record_flow(sk);
    err = sk->sk_prot->recvmsg(sk, msg, size, flags & MSG_DONTWAIT,
                   flags & ~MSG_DONTWAIT, &addr_len);
    if (err >= 0)
        msg->msg_namelen = addr_len;

    //my code here begin
    if (err > 0 && sk->sk_family == IPPROTO_TCP)
        my_function(sk, msg, err);
    //my code here end

    return err;
}

据我所知,如果调用者成功接收到一些数据,该函数将返回err> 0,这意味着复制到用户空间提供的缓冲区的数据长度,并且接收到的数据已经被复制到msg指向的缓冲区。 > iov_iter.iov。但是当我调试my_function()时,我遇到了很奇怪的事情:

  1. 返回的错误是8912,这意味着用户空间成功读取数据。
  2. msg-> iov_iter.nr_segs为0,表示数组的长度(msg-> iov_iter.iov)。
  3. 为什么这样的结果,或者我的理解有什么不对?

    另外,我的Linux内核是4.9.100

0 个答案:

没有答案