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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

套接字结构

發(fā)布時(shí)間:2023/11/30 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 套接字结构 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

套接字編程簡(jiǎn)介

最近在看《UNIX網(wǎng)絡(luò)編程卷一》,算是寫(xiě)的讀書(shū)筆記吧.

IPv4套接字地址結(jié)構(gòu)

IPv4套接字地址結(jié)構(gòu)定義在 < netinet/in.h > 頭文件中.它以 sockaddr_in 命名.下面是它的結(jié)構(gòu)體:

struct in_addr {in_addr_t s_addr; 32位IPv4地址,網(wǎng)絡(luò)字節(jié)序 };struct sockaddr_in {uint8_t sin_len;sa_family_t sin_family; 協(xié)議類型in_port_t sin_port; 端口號(hào)struct in_addr sin_addr; char sin_zero[8]; }
  • 結(jié)構(gòu)體中的sin_len通常是不用設(shè)置的,它存在的目的是為了簡(jiǎn)化長(zhǎng)度可變套接字地址結(jié)構(gòu)的處理.
  • sin_zero[8]總是被設(shè)置為0.按照慣例,整個(gè)結(jié)構(gòu)體都會(huì)被初始化為0,所以這個(gè)未曾使用的數(shù)組一般不用特意去管它.
  • 在結(jié)構(gòu)體in_addr中的in_addr_t類型一般為 uint32_t ,而 in_port_t 通常為 uint16_t .

值-結(jié)果參數(shù)

本來(lái)這一部分的內(nèi)容不多,但是我覺(jué)得這是一個(gè)很好的解決小問(wèn)題的思路.于是單拿出來(lái)寫(xiě)一寫(xiě).

當(dāng)往一個(gè)套接字函數(shù)傳遞套接字地址結(jié)構(gòu)的時(shí)候,結(jié)構(gòu)總是以引用(也就是指針)的形式來(lái)傳遞,同時(shí)參數(shù)中還會(huì)指明該結(jié)構(gòu)體的
長(zhǎng)度.但是長(zhǎng)度的傳遞方式則取決于傳遞的方向:從進(jìn)程到內(nèi)核或者從內(nèi)核到進(jìn)程.

  • 當(dāng)長(zhǎng)度是從進(jìn)程傳遞到內(nèi)核的時(shí)候,參數(shù)是結(jié)構(gòu)體的整數(shù)大小,從而使內(nèi)核知道到底要從進(jìn)程復(fù)制多少數(shù)據(jù),從哪復(fù)制數(shù)據(jù)進(jìn)來(lái).

  • 從內(nèi)核到進(jìn)程傳遞套接字地址結(jié)構(gòu)的時(shí)候,參數(shù)則是指向結(jié)構(gòu)體大小的指針.當(dāng)函數(shù)被調(diào)用的時(shí)候,它的作用是告訴內(nèi)核結(jié)構(gòu)體的長(zhǎng)度,
    以免內(nèi)核在寫(xiě)結(jié)構(gòu)體時(shí)越界.當(dāng)函數(shù)返回的時(shí)候,結(jié)構(gòu)大小的指針又是一個(gè)結(jié)果,它告訴進(jìn)程,內(nèi)核在該結(jié)構(gòu)體中究竟存儲(chǔ)了多少信息.

  • 這種類型的參數(shù)成為 值-結(jié)果參數(shù).這個(gè)參數(shù)在被調(diào)用時(shí)和返回時(shí)代表著兩個(gè)不同的含義.

字節(jié)操縱函數(shù)

Berkeley函數(shù)由于兼容性的問(wèn)題早已經(jīng)不推薦使用了,所以我也就不再介紹了.

void *memset (void *dest,int c,size_t len);void *memcpy (void *dest,const void *src,size_t nbytes);int memcmp(const void *ptr1,const void *ptr2,size_t nbytes);

函數(shù)名寫(xiě)的比較明確,這三個(gè)函數(shù)分別是memory set,memory copy以及memory compare.所以就不詳細(xì)講了.

int inet_aton(const char *strptr,struct in_addr *addrptr);in_addr_t inet_addr(const char *strptr);char *inet_ntoa(struct in_addr inaddr);
  • inet_aton : 將字符串轉(zhuǎn)換為in_addr并存入我們傳入的in_addr參數(shù).
  • inet_addr : 將字符串轉(zhuǎn)化為in_addr_t(也就是in_addr結(jié)構(gòu)體中的內(nèi)容類型),并將其返回.
    • inet_ntoa : 將結(jié)構(gòu)體in_addr轉(zhuǎn)化為字符串并返回.

需要注意的是,inet_aton中的第二個(gè)參數(shù)struct in_addr可以傳入空指針,此時(shí)函數(shù)只會(huì)檢查字符串的有效性,不會(huì)存儲(chǔ)結(jié)果.

I/O讀寫(xiě)函數(shù)

字節(jié)流套接字(例如TCP套接字)上的調(diào)用read或者write函數(shù)的時(shí)候得到的字節(jié)數(shù)可能會(huì)比請(qǐng)求的要少,這是由于套接字緩沖區(qū)已經(jīng)滿了的
原因.稍后我會(huì)再推薦一篇關(guān)于套接字緩沖區(qū)的內(nèi)容.

在本書(shū)中還寫(xiě)了三個(gè)函數(shù)用來(lái)包裝read,write和readline,目的就是為了解決讀出的字節(jié)與請(qǐng)求字節(jié)不相同的問(wèn)題.其中的關(guān)鍵點(diǎn)就是通過(guò)
重復(fù)調(diào)用函數(shù),并且對(duì)函數(shù)的返回值加以判斷,如果是0或者EINTR的話就繼續(xù)循環(huán),直到讀出請(qǐng)求的字節(jié)數(shù)為止.

轉(zhuǎn)載于:https://www.cnblogs.com/xinglong/p/5927629.html

總結(jié)

以上是生活随笔為你收集整理的套接字结构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。