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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

socket与文件描述符

發布時間:2023/12/18 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 socket与文件描述符 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在Linux編程時,無論是在操作文件還是網絡操作時都能夠通過文件描述符來read或者write。之前在沒有接觸C++的時候,不懂面向對象的那套東西。自從學習了C++以及面向對象的一些知識以后突然對Linux這套文件描述符有了稍微深刻的認識。
怎么說呢,Linux這一套文件機制就相當于面向對象里面的多態,拿到一個文件描述符都可以進行read或者write。但是具體的read和write卻跟對應文件描述符的具體實現不同。比如socket的就是走網絡,普通文件的就是走磁盤IO。
下面一張UML類圖大概表現出了Linux文件描述符的大概意思:
當然,為了將不同的類型的I/O與對應的文件描述符綁定,則是需要不同的初始化函數的。在C++中有構造函數跟編譯器幫助搞定,在C函數里只能自己動手豐衣足食了。 普通文件就通過open函數,指定對應的文件路徑,操作系統通過路徑能夠找到對應的文件系統類型,如ext4啊,fat啊等等。 如果是網絡呢,就通過socket函數來初始化,socket函數就通過(domain, type, protocol)來找到對應的網絡協議棧,比如TCP/IP,UNIX等等。
整個Linux 文件系統的結構差不多就這個意思,socket跟他綁定也是為了統一接口。 所以網絡相關的調用,如connect, bind等等,第一步基本上就是通過文件描述符找到對應的內核socket結構,然后在進行對應的操作。
  • SYSCALL_DEFINE2(listen,?int,?fd,?int,?backlog)
  • {
  • ????struct socket?*sock;
  • ????int?err,?fput_needed;
  • ????int?somaxconn;

  • ? ? /* 通過文件描述符獲得 kernel socket結構, 并且增加此結構的引用計數 */
  • ? ? sock?=?sockfd_lookup_light(fd,?&err,?&fput_needed);
  • ????if?(sock)?{
  • ? ? ? ? /* 進行檢測,看看是否滿足系統設計的需求,功能上不重要 */
  • ????????somaxconn?=?sock_net(sock->sk)->core.sysctl_somaxconn;
  • ????????if?((unsigned)backlog?>?somaxconn)
  • ????????????backlog?=?somaxconn;
  • ? ? ? ? /* 檢測此調用是否安全 */
  • ????????err?=?security_socket_listen(sock,?backlog);
  • ? ? ? ? /* 執行具體的listen操作,TCP啊,或者是其他網絡協議等等,這個ops是在socket時候綁定的 */
  • ????????if?(!err)
  • ????????????err?=?sock->ops->listen(sock,?backlog);
  • ? ? ? ? /* 減少kernel socket的引用計數 */
  • ????????fput_light(sock->file,?fput_needed);
  • ????}
  • ????return?err;
  • }
  • 上面就是一個典型的調用listen的內核操作。
    在socket層內核完成的就是一個interface功能,或許也可以叫做橋接模式(bridge pattern)。
    這就是我對socket及Linux文件描述符的理解。

    總結

    以上是生活随笔為你收集整理的socket与文件描述符的全部內容,希望文章能夠幫你解決所遇到的問題。

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