if;(retval;<;0)
goto;out;
retval;=;sock_map_fd(sock);
if;(retval;<;0)
goto;out_release;
out:
return;retval;
out_release:
sock_release(sock);
return;retval;
}
关键就2个函数 , sock_create()来初始化一个struct;socket结构体,在用sock_map_fd()来给刚才的socket结构分配一个空闲的文件描述符 。;有兴趣的读者可以继续深入这些函数 , 看看它的具体实现细节 。在这里我们只关心最上层的这2个函数 。因为我们要在自己的模块中调用它们 。同样对于;sys_bind,;sys_listen等 , 我们用同样的办法来处理 。有了源代码 , 看它们怎么实现 , 我们就怎么实现 。
下面给出一个监听某端口的例子:
int;k_listen(void)
{
struct;socket;*sock,*newsock;
struct;sockaddr_in;server;
struct;sockaddr;client[128];
char;address[128];
int;sockfd,;sockid,;i,size;=;0;
int;error;=;0,len;=;sizeof(struct;sockaddr);
//set_fs(KERNEL_DS);
error;=;sock_create(AF_INET,SOCK_STREAM,0,&sock);
if;(error;<;0);{
printk("[-];socket_create;failed:;%d/n",error);
sock_release(sock);
return;-1;
}
sockfd;=;sock_map_fd(sock);
if;(sockfd;<;0);{
printk("[-];sock_map_fd();failed./n");
sock_release(sock);
return;-1;
}
for;(i;=;0;;i;<;8;;i)
server.sin_zero[i];=;0;
server.sin_family;=;PF_INET;
server.sin_addr.s_addr;=;INADDR_ANY;
server.sin_port;=;htons(port);
error;=;security_socket_bind(sock,(struct;sockaddr;*)&server,len);
if;(!error);{
error;=;sock->ops->bind(sock,(struct;sockaddr;*)&server,len);
if;(error;<;0);{
printk("[-];unix_bind();failed./n");
sock_release(sock);
return;-1;
}
推荐阅读
- 图 网管必学技术:Linux系统终极安装手册
- 在Linux下配置多线路ADSL的方法
- Linux命令之网络安全基础知识
- Linux 用户管理工具介绍
- 五个顶级Linux安全工具
- Linux系统安全隐患及加强安全管理方法
- Linux系统安全设置 全面坚固系统稳定安全
- 图 U盘及硬盘安装、配置、中文化 Puppy linux 4.00
- 图 随身系统:Puppy Linux 4.00 初体验
- 教程:三万元搭建Linux服务器集群