socket 基礎知識

2021-05-21 11:49:50 字數 1811 閱讀 1734

socket是使用 標準unix 檔案描述符 (file descriptor) 和其它程式通訊的方式。

struct sockaddr.。這個結構 為許多態別的套接字儲存套接字位址資訊:

struct sockaddr ;

sa_family 能夠是各種各樣的型別,但是在這篇文章中都是 "af_inet"。 sa_data包含套接字中的目標位址和埠資訊。這好像有點 不明智。

為了處理struct sockaddr,程式設計師創造了乙個並列的結構: struct sockaddr_in ("in" 代表 "internet"。)

struct sockaddr_in ;

用這個資料結構可以輕鬆處理套接字位址的基本元素。

乙個指向 sockaddr_in結構體的指標也可以被指向結構體sockaddr並且代替它。這 樣的話即使 socket() 想要的是 struct sockaddr *,你仍然可以使用 struct sockaddr_in,並且在最後轉換。同時,注意 sin_family 和 struct sockaddr 中的 sa_family 一致並能夠設定為 "af_inet"。最後,sin_port和 sin_addr 必須是網路位元組順序 (network byte order)!

htons()--"host to network short"

htonl()--"host to network long"

ntohs()--"network to host short"

ntohl()--"network to host long"

為什麼在資料結構 struct sockaddr_in 中, sin_addr 和 sin_port 需要轉換為網路位元組順序,而sin_family 需不需要呢? 答案是: sin_addr 和 sin_port 分別封裝在包的 ip 和 udp 層。因此,它們必須要 是網路位元組順序。但是 sin_family 域只是被核心 (kernel) 使用來決定在數 據結構中包含什麼型別的位址,所以它必須是本機位元組順序。同時, sin_family 沒有傳送到網路上,它們可以是本機位元組順序。

ip 位址和如何處理它們

現在我們很幸運,因為我們有很多的函式來方便地操作 ip 位址。沒有 必要用手工計算它們,也沒有必要用"<<"操作來儲存成長整字型。 首先,假設你已經有了乙個sockaddr_in結構體ina,你有乙個ip地 址"132.241.5.10"要儲存在其中,你就要用到函式inet_addr(),將ip位址從 點數格式轉換成無符號長整型。使用方法如下:

ina.sin_addr.s_addr = inet_addr("132.241.5.10");

注意,inet_addr()返回的位址已經是網路位元組格式,所以你無需再呼叫 函式htonl()。

我們現在發現上面的**片斷不是十分完整的,因為它沒有錯誤檢查。 顯而易見,當inet_addr()發生錯誤時返回-1。記住這些二進位制數字?(無符 號數)-1僅僅和ip位址255.255.255.255相符合!這可是廣播位址!大錯特 錯!記住要先進行錯誤檢查。

好了,現在你可以將ip位址轉換成長整型了。有沒有其相反的方法呢? 它可以將乙個in_addr結構體輸出成點數格式?這樣的話,你就要用到函式 inet_ntoa()("ntoa"的含義是"network to ascii"),就像這樣:

printf("%s",inet_ntoa(ina.sin_addr));

它將輸出ip位址。需要注意的是inet_ntoa()將結構體in-addr作為一 個引數,不是長整形。同樣需要注意的是它返回的是乙個指向乙個字元的 指標。它是乙個由inet_ntoa()控制的靜態的固定的指標,所以每次呼叫 inet_ntoa(),它就將覆蓋上次呼叫時所得的ip位址。

socket基礎知識

注意 如果你已經接觸過socket,那就沒什麼必要耽誤時間看下去了。另外,如果發現其中任何錯誤,歡迎直接指出。1.按慣例先來介紹下socket windows中的很多東西都是從unix領域借鑑過來的,socket也是一樣。在unix中,socket代表了一種檔案描述符 在unix中一切都是以檔案為單...

socket程式設計基礎知識

為了使網路上的計算機能夠彼此識別對方,每台計算機都需要乙個ip位址以標識自己。ip位址由ip協議規定,以32位的二進位制數示。最新的ipv6協議將ip位址公升為128位,這使得ip位址更加廣泛,能夠很好地解決目前ip位址緊缺的情況,但是ipv6協議距離實際應用還有一段距離,目前多數作業系統和應用軟體...

Socket程式設計 基礎知識

一 計算機通訊的必備條件 ip 埠 區分不同的應用程式 埠範圍是0 65535,1 1023被系統保留 協議二 tcp ip 傳輸控制協議 網際網路協議 模型 應用層 http 超文字傳輸協議 瀏覽網頁,80 ftp 簡單郵件傳送協議 telnet 遠端登路服務 23 傳輸層 tcp ip協議 網路...