关于4.x内核的内核态socket编程问题(sock_create_kern)

tags : linux socket


linux内核态socket编程如何实现:(以tcp服务端举例)

1、sock_create_kern()
2、kernel_setsockopt()这一步为可去掉的,但是如果想socket进行配置,则需要此步骤,例如配置成非阻塞模式:

struct timeval tv;

tv.tv_sec = 0;
tv.tv_usec = 1000 * RECV_WATI_TIME_MS;
kernel_setsockopt(sock_srv, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv));

3、kernel_bind()
4、kernel_listen()
5、kernel_accept()
6、kernel_sendmsg()/kernel_recvmsg()
7、sock_release()

其他的也都类似,这里不记录了。

关于不同版本的linux对于sock_create_kern函数的定义

linux2.x的版本

int sock_create_kern(int family, int type, int protocol, struct socket **res)
{
    return __sock_create(family, type, protocol, res, 1);
}

linux3.x的版本:

int sock_create_kern(int family, int type, int protocol, struct socket **res)
{
    return __sock_create(&init_net, family, type, protocol, res, 1);
}

linux4.x的版本

int sock_create_kern(struct net *net, int family, int type, int protocol, struct socket **res)
{
    return __sock_create(net, family, type, protocol, res, 1);
}

所以,这里在4.x版本里面创建socket的话,最简单的方式是这样调用:

sock_create_kern(&init_net, family, type, protocol, res);

还有一个create socket的函数不要用!!!

int sock_create(int family, int type, int protocol, struct socket **res)
{
    return __sock_create(current->nsproxy->net_ns, family, type, protocol, res, 0);
}

如果用这个函数创建socket,可以成功的bind、listen、accept,但是一到sendmesg、recvmesg就会出现permission denied。

先在这里插个眼,今后有空的时候再来研究下struct net *net相关的内容,把原因补上。

Logo

更多推荐