2-5:套接字(Socket)编程之从内核角度深入理解套接字
生活随笔
收集整理的這篇文章主要介紹了
2-5:套接字(Socket)编程之从内核角度深入理解套接字
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
以TCP通信為例,創(chuàng)建套接字時(shí)使用的接口是socket,監(jiān)聽(tīng)使用的listen,綁定使用的bind,不管怎樣,他們都是系統(tǒng)調(diào)用接口。在Linux內(nèi)核代碼中,是通過(guò)call來(lái)區(qū)分的
其實(shí),創(chuàng)建套接字的時(shí)候,在底層會(huì)首先創(chuàng)建一個(gè)內(nèi)核結(jié)構(gòu),叫做struct socket
其中有兩個(gè)非常重要的struct,分別是file和sock。file與文件有關(guān),因?yàn)閟ocket本質(zhì)就是文件,而這是套接字,一定還要與網(wǎng)絡(luò)相關(guān),因此其內(nèi)部還會(huì)有一個(gè)結(jié)構(gòu)體是sock
如下是sock結(jié)構(gòu)體
當(dāng)然這里不止這么一種sock,還有很多種sock,例如tcp_sock,udp_sock,raw_sock
在sock中有兩個(gè)結(jié)構(gòu)體:
struct sk_buff_head sk_receive_queue;//接受的數(shù)據(jù)放入接受隊(duì)列 struct sk_buff_head sk_write_queue;//用戶(hù)層寫(xiě)入的數(shù)據(jù)放入該隊(duì)列當(dāng)然如果你使用的是tcp,那么使用的sock就是tcp_sock
如果你使用的是udp,那么使用的sock就是udp_sock
大家可以看到無(wú)論是udp_sock還是tcp_sock,都必須保證“inet_sock has to be the first member ”
同時(shí)inet_sock里的第一個(gè)字段正是sock
整個(gè)過(guò)程實(shí)際有點(diǎn)繞,但是總結(jié)到下面這張圖中就十分清晰了
結(jié)合前面說(shuō)過(guò)的task_struct,訪(fǎng)問(wèn)時(shí)只要強(qiáng)轉(zhuǎn),也就是進(jìn)行切片操作就可以完成任意結(jié)構(gòu)體的訪(fǎng)問(wèn)了
在創(chuàng)建套接字時(shí),會(huì)調(diào)用sock_map_fd,創(chuàng)建一個(gè)文件,然后分配文件描述符
然后再用sock_attach_fd,讓文件和套接字產(chǎn)生關(guān)聯(lián)
也就是下面這樣
文件與套接字關(guān)系如下
總結(jié)
以上是生活随笔為你收集整理的2-5:套接字(Socket)编程之从内核角度深入理解套接字的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Windows系统下使用Sublime搭
- 下一篇: DIB位图(Bitmap)的读取和保存