Linux Socket學習 為套介面繫結位址

2021-09-23 21:31:29 字數 1454 閱讀 7901

當我們使用socket函式建立乙個套介面之後,這個套介面就處於無名狀態,雖然之前我們提到即使沒有位址,套介面也能使用,但是這個只限於套介面對在同乙個linux核心中,如果位於兩台不同的主機的套介面需要連線,而又沒有位址,那麼就無法工作。

函式bind的作用就是為無名套介面分配位址,語法如下:

#include #include int bind(int sockfd, struct sockaddr* my_addr, int addrlen);

函式呼叫成功返回0,否則返回-1,我們可以通過檢視errno的值來了解錯誤原因。

但是需要注意的是提供給bind函式的套介面當前必須處於無名狀態(也就是沒有位址),如果我們使用bind函式為乙個已經有位址的套介面繫結另外乙個位址的話,會出現錯誤。

下面的例子展示了如何使用bind函式。

----undone(此處**稍後新增)

下面我們來看看geisockname()函式。

#include int getsockname(int s, struct sockaddr* name, socklen_t* namelen);

其中s表示我們想要知道位址的那個套介面,name指向接受緩衝區的指標,namelen是指向最大長度的指標變數。這個變數給出了接受緩衝區所能夠接受的最大位元組數,當接收緩衝區被寫入之後,這個值就會被更新為實際寫入的位元組數。

函式呼叫成功返回0,否則返回-1、

下面的**展示了getsockname函式的使用:

----undone(此處**稍後新增)

我們在之前了解了使用函式getsockname()可以獲得套介面本地協議位址的作用,但是有時候我們不但需要確定套介面的本地協議位址,還需要確定與本地套介面相連線的遠端套介面的協議位址,這個時候我們就可以使用函式getpeername():

#include int getpeername(int s, struct sockaddr*name, socklen_t* namelen);

函式呼叫成功返回0,失敗返回-1、

下面的例子展示了一下getpeername函式的使用方法:

----undone(此處**稍後新增)為了給通訊指定乙個特定的介面,我們需要:

1)用socket函式生成乙個套介面

2)使用函式bind將想要接受連線的介面的ip位址繫結到本地套介面。

----undone(此處**稍後新增)

繫結統配介面

1)使用socket函式生成套介面,2)使用bind函式將ip位址inaddr_any繫結到本地套介面。下面的**展示了這一操作:

----undone(此處**稍後新增)

Linux Socket學習 域和套介面簡介

套介面建立後,就如同乙個檔案描述符,我們可以使用同樣的io函式進行讀寫,關閉操作。其實,和引用乙個已經開啟的檔案一樣,套介面也是通過檔案描述符來引用的,而且兩者的檔案描述符共享乙個 數字空間 比如說不能既開啟乙個檔案描述符為4的套介面,又開啟乙個檔案描述符為4的檔案。套介面和已經開啟的檔案的區別 1...

Linux Socket學習 域和套介面簡介

套介面建立後,就如同乙個檔案描述符,我們可以使用同樣的io函式進行讀寫,關閉操作。其實,和引用乙個已經開啟的檔案一樣,套介面也是通過檔案描述符來引用的,而且兩者的檔案描述符共享乙個 數字空間 比如說不能既開啟乙個檔案描述符為4的套介面,又開啟乙個檔案描述符為4的檔案。套介面和已經開啟的檔案的區別 1...

樹套樹學習筆記

題目 傳送門 這是第一類入門級的樹套樹,線段樹 樹狀陣列套平衡樹。用線段樹或樹狀陣列維護區間,再用平衡樹維護對區間中的動態修改。相對於普通的直白操作會好一些,但會帶好幾個log 有人可能會疑惑為什麼為每個區間開一棵平衡樹不會mle呢?我們以線段樹為例,每一層的線段樹的節點數都為n,至多有logn層。...