日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/6/16 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 内核中的UDP socket流程(2)——API “sys_socket” 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

作者:gfree.wind@gmail.com 原文: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之后,我們獲得了一個socket,然后調用sock_map_fd,將其映射為文件描述符,并將這個描述符返回給用戶。 今天又晚了。。。正在看sock_create的代碼,明天繼續吧。

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的内核中的UDP socket流程(2)——API “sys_socket”的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。