文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>内核中的UDP socket流程(2)——API “sys_socket”

内核中的UDP socket流程(2)——API “sys_socket”

时间:2010-12-23  来源:GFree_Wind

内核中的UDP socket流程(2)——API “sys_socket”

作者:[email protected] 原文:http://blog.chinaunix.net/u3/116859/showart.php?id=2445122
前面已经列出了UDP常用的4个API,那么下面从第一个API “sys_socket”开始

1272 SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)
1273 {
1274     int retval;
1275     struct socket *sock;
1276     int flags;
1277
1278     /* Check the SOCK_* constants for consistency. */
1279     BUILD_BUG_ON(SOCK_CLOEXEC != O_CLOEXEC);
1280     BUILD_BUG_ON((SOCK_MAX | SOCK_TYPE_MASK) != SOCK_TYPE_MASK);
1281     BUILD_BUG_ON(SOCK_CLOEXEC & SOCK_TYPE_MASK);
1282     BUILD_BUG_ON(SOCK_NONBLOCK & SOCK_TYPE_MASK);
1283
1284     flags = type & ~SOCK_TYPE_MASK;
1285     if (flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
1286         return -EINVAL;
1287     type &= SOCK_TYPE_MASK;
1288
1289     if (SOCK_NONBLOCK != O_NONBLOCK && (flags & SOCK_NONBLOCK))
1290         flags = (flags & ~SOCK_NONBLOCK) | O_NONBLOCK;
1291
1292     retval = sock_create(family, type, protocol, &sock);
1293     if (retval < 0)
1294         goto out;
1295
1296     retval = sock_map_fd(sock, flags & (O_CLOEXEC | O_NONBLOCK));
1297     if (retval < 0)
1298         goto out_release;
1299
1300 out:
1301     /* It may be already another descriptor 8) Not kernel problem. */
1302     return retval;
1303
1304 out_release:
1305     sock_release(sock);
1306     return retval;
1307 }

1272行:使用宏SYSCALL_DEFINE3定义了内核export出来的API “sys_socket”,参数是int family, int type, 和int protocol。
1279~1282行:对于这些常量作出编译期间的检查。
1284~1286行:在linux2.6.27以前的版本,参数int type只能取真正的socket type的值,即下面的

enum sock_type {
    SOCK_STREAM    = 1,
    SOCK_DGRAM    = 2,
    SOCK_RAW    = 3,
    SOCK_RDM    = 4,
    SOCK_SEQPACKET    = 5,
    SOCK_DCCP    = 6,
    SOCK_PACKET    = 10,
};

但是在Linux 2.6.27版本以后,type有了第二个用途,它可以或上下面的两个数,来指定socket的行为。

#define SOCK_CLOEXEC    O_CLOEXEC
#ifndef SOCK_NONBLOCK
#define SOCK_NONBLOCK    O_NONBLOCK
#endif

所以,1284行到1286行,是为了检测是否type是否只set了上面两个位。如果不是的话,即为非法的type,返回错误EINVAL。
1287行:获得真正的type值
1289~1290行:如果socket的NOBLOCK标志位不等于普通的文件描述符标志的NOBLOCK标志,且该socket设置了SOCK_NONBLOCK,那么就取消这个SOCK_NONBLOCK标志位,并设置上O_NONBLOCK标志位。
今天又晚了。。。正在看sock_create的代码,明天继续吧。

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载