套接字程式設計簡介

2021-07-04 19:43:44 字數 1731 閱讀 5965

這是unp的第三章,主要講了一些基礎的struct以及一些基礎的api,這些struct在後面會一直使用的。

ipv4與ipv6的結構儘管不一樣,但類似,連起名都只是ipv6的比ipv4的多來個6,如:struct in6_addr與struct in_addr,struct sockaddr_in6與struct_ sockaddr_in等。猜想之所以是sockaddr_in而不是sockaddr_in4(自己根據ipv6的命名杜撰出來的)是為了保持向後相容,以前ipv6沒出現的時候只有ipv4,一直都是這麼用的。

書中提到的值-結構引數,據我理解,其實就是把乙個指標傳給函式,其指向的值可變(沒有const修飾),即該變數即作為輸入又儲存輸出。

之所以有這系列的函式,我的理解是:有的系統採用小端位元組序,有的系統採用大端位元組序,而網際協議使用大端位元組序。為了保證在網路上傳輸的時候與網際協議一致(即大端位元組序),就在提供來這些位元組排序函式,這樣保證傳送時的位元組序正確,同時從網路接受到位元組序時,轉換位與系統相一致的位元組序。

ps:將低序位元組儲存在起始位址,稱為小端位元組序;將高序位元組儲存在起始位址,稱為大端

書中提到來3個位元組操縱函式:bzero, bcopy, bcmp,同時提到來三個ansi c函式:memset, memcpy, memcmp。之所以提供前三個函式,而不用後三個,是因為,當處理套接字位址結構時,操縱諸如ip位址這樣的字段,這些字段可能包含值為0的位元組,卻並不是c字串(c字串以0作為結束的標誌)。另外需要注意的是,當源位元組串與目標位元組串重疊時,bcopy能夠正確處理,但是memcpy的操作結果不可知。(突然想起之前在游族面試的時候遇到過這個考題,就是讓寫個類似與memcpy的函式的,如果不考慮位址重疊肯定就達不到要求了,另外,還要注意源位址與目標位址誰大誰小的問題,以此確定拷貝順序)

作者都說了,全書後面部分都將採用inet_pton與inet_ntop,所以inet_aton,inet_addr, inet_ntoa這三個函式,了解一下即可,看得懂就行了,看作者字裡行間的意思,後面會一直使用前兩個函式。位址轉換函式是在ascii字串與網路位元組序的二進位制值之間轉換網際協議位址的。說通俗一點,就是你寫程式的時候寫192.168.10.5這樣的ip位址,這是ascii字串,但你需要的填的套接字位址結構不認識啊,這個時候位址轉換函式就起作用了,這些函式的作用就像翻譯員一樣。

struct sockaddr_in addr;

inet_ntop(ap_inet, &addr.sin_addr, str, sizeof(str));

但為ipv6編寫**,是這樣的:

struct sockaddr_in6 addr6;

inet_ntop(af_inet6, &addr6.sin6_addr, str, sizeof(str));

作者寫來個協議無關函式:

char *sock_ntop(const

struct sockaddr *sockaddr, socklen_t addrlen);

其實就是利用struct sockaddr中的sa_family來區分是什麼協議,內部還是呼叫inet_ntop。這裡注意,得到的ascii字串不再是前面提到的值-結果引數了,而是用return返回。**中return的str是靜態的,用了static修飾,否則會成為野指標。

作者還提供來其他一些方便函式,這裡就不一一枚舉了。

套接字程式設計簡介

以sockaddr in命名,定義在中。typedef uint32 t in addr t struct in addr struct sockaddr in 當作為乙個引數傳遞進任何套接字函式時,套接字位址結構總是以引用形式 也就是指向該結構的指標 傳遞。然而以這樣的指標為引數之一的任何套接字函...

套接字程式設計簡介

struct in addr posix規範只需要這個結構中的3個字段 sin family,sin addr,sin port struct sockaddr in 從核心到程序 為了使套接字函式能夠處理來自所支援的任何協議族的套接字位址結構,在標頭檔案中定義了乙個通用的套接字位址結構,並將指向某...

套接字程式設計簡介

目錄 4.位元組排序函式 5.位址轉換函式 在同一臺主機或裝置上,可能有多個程序同時在使用tcp或udp協議,埠號的作用就是區分這些不同的程序,即每個程序使用各自不同的埠號。對於tcp協議和udp協議,埠號都是用unsigned short型別表示,即埠號的範圍為0 65535,這65536個埠號被...