函数input()会在发送进程执行sendmsg()时被调用,这样处理消息比较及时,但是,如果消息特别长时,这样处理将增加系统调用 sendmsg()的执行时间,对于这种情况,可以定义一个内核线程专门负责消息接收,而函数input的工作只是唤醒该内核线程,这样sendmsg将 很快返回。 函数skb = skb_dequeue(&sk->receiv
我们知道socket消息的发送和接收函数一般有这几对:recv/send、readv/writev、recvfrom/sendto。当然还有recvmsg/sendmsg,前面三对函数各有各的特点功能,而recvmsg/sendmsg就是要囊括前面三对的所有功能,当然还有自己特殊的用途。msghdr的前两个成员就是为了满足recvfrom/sendto的功能,中间两个成员msg_iov和msg_iovlen则...
根据传入的used_address指针判断当前发送消息的目的地址是否同它记录的一致,如果一致则调用sock_sendmsg_nosec()函数发送数据,否则调用sock_sendmsg()函数发送数据,sock_sendmsg()其实最终也是通过调用sock_sendmsg_nosec()来发送数据的,它们的区别就在于是否调用安全检查函数,如下: intsock_sendmsg(structsocket *sock,str...
当然还有recvmsg/sendmsg,前面三对函数各有各的特点功能,而recvmsg/sendmsg就是要囊括前面三对的所有功能,当然还有自己特殊的用途。msghdr的前两个成员就是为了满足recvfrom/sendto的功能,中间两个成员msg_iov和msg_iovlen则是为了满足readv/writev的功能,而最后的msg_flags则是为了满足recv/send中flag的功能,剩下的m...
sendmsg(fd, &msg,0); ... len = recvmsg(fd, &msg,0); ... socket 的参数 protocol 指定了创建的套接字对应的 netlink 协议,不同的协议可以和不同的内核模块通信, netlink 支持的协议可以在 include/linux/netlink.h 文件中看到: // include/linux/netlink.h ...
socket消息数据包结构 应用层通过sendto()或sendmsg()函数向内核发送消息。msghdr结构包含msg_name、msg_namelen、msg_iov、msg_control、msg_controllen和msg_flags。msg_name指向目的地址,msg_iov包含消息实际数据,msg_control辅助数据,msg_controllen大小。netlink消息中,msg_name指向目的sockaddr_nl...
当然还有recvmsg/sendmsg,前面三对函数各有各的特点功能,而recvmsg/sendmsg就是要囊括前面三对的所有功能,当然还有自己特殊的用途。msghdr的前两个成员就是为了满足recvfrom/sendto的功能,中间两个成员msg_iov和msg_iovlen则是为了满足readv/writev的功能,而最后的msg_flags则是为了满足recv/send中flag的功能,剩下的...
Classic Netlink传输消息通过sendto或者sendmsg函数从用户空间发送到内核空间。skb包含了该传输消息,它是input函数的唯一参数,可以在input函数中通过skb->data获取该传输消息。问题是Linux内核Netlink子系统会如何检查该传输消息?答案是什么都不检查。这意味着开发者需要自己检查该传输消息头,而将检查交给开发者本身就是一...
为了发送一条netlink消息到内核或者其他的用户空间进程,另外一个struct sockaddr_nl nladdr需要作为目的地址,这和使用sendmsg()发送一个UDP包是一样的。 如果该消息是发送至内核的,那么nl_pid和nl_groups都置为0. 如果消息是发送给另一个进程的单播消息,nl_pid是另外一个进程的pid值而nl_groups为零。
只有当内核空间中的input()函数返回时,用户 调用的sendmsgO函数才会返回。对于这种情况,可以肚义一个内核线程专门负责消息接收, 而函数input的工作只是唤醒该内核线程,这样sendmsg将很快返回。(这里网上的的说明) 不过在查看Linux2.6.37版本的内核时并没有发现这种处理过程,一般都是按下而的方法进 行处理。这里注册的...