摘要:在套介面中,乙個套接字只是使用者程式與核心互動資訊的樞紐,它自身沒有太多的資訊,也沒有網路協議位址和埠號等資訊,在進行網路通訊的時候,必須把乙個套接字與乙個位址相關聯,這個過程就是位址繫結的過程。許多時候核心會我們自動繫結乙個位址,然而有時使用者可能需要自己來完成這個繫結的過程,以滿足實際應用的需要,最典型的情況是乙個伺服器程序需要繫結乙個眾所周知的位址或埠以等待客戶來連線。這個事由 bind的函式完成。
#include
int bind
(int sockfd,
struct sockaddr
* addr, socklen_t addrlen
)返回:
0 ──成功,
-1 ──失敗
引數sockfd
指定位址與哪個套接字繫結,這是乙個由之前的socket函式呼叫返回的套接字。呼叫bind的函式之後,該套接字與乙個相應的位址關聯,傳送到這個位址的資料可以通過這個套接字來讀取與使用。
引數addr
指定位址。這是乙個位址結構,並且是乙個已經經過填寫的有效的位址結構。呼叫bind之後這個位址與引數sockfd指定的套接字關聯,從而實現上面所說的效果。
引數addrlen
正如大多數socket介面一樣,核心不關心位址結構,當它複製或傳遞位址給驅動的時候,它依據這個值來確定需要複製多少資料。這已經成為socket介面中最常見的引數之一了。
bind函式並不是總是需要呼叫的,只有使用者程序想與乙個具體的位址或埠相關聯的時候才需要呼叫這個函式。如果使用者程序沒有這個需要,那麼程式可以依賴核心的自動的選址機制來完成自動位址選擇,而不需要呼叫bind的函式,同時也避免不必要的複雜度。在一般情況下,對於伺服器程序問題需要呼叫 bind函式,對於客戶程序則不需要呼叫bind函式。
bind函式
int bind(
socket s,
const struct sockaddr far *name,
int namelen
); 當建立了乙個socket以後,套接字資料結構中有乙個預設的ip位址和預設的埠號。乙個服務程式必須呼叫bind函式來給其繫結乙個ip位址和乙個特定的埠號。客戶程式一般不必呼叫bind函式來為其socket繫結ip位址和斷口號。該函式的第乙個引數指定待繫結的socket描述符;第二個引數指定乙個sockaddr結構,該結構是這樣定義的:
struct sockaddr ;
其中sin_family置af_inet;sin_port指明埠號;sin_addr結構體中只有乙個唯一的字段s_addr,表示ip位址,該字段是乙個整數,一般用函式inet_addr()把字串形式的ip位址轉換成unsigned long型的整數值後再置給s_addr。有的伺服器是多宿主機,至少有兩個網絡卡,那麼執行在這樣的伺服器上的服務程式在為其socket繫結ip位址時可以把htonl(inaddr_any)置給s_addr,這樣做的好處是不論哪個網段上的客戶程式都能與該服務程式通訊;如果只給執行在多宿主機上的服務程式的socket繫結乙個固定的ip位址,那麼就只有與該ip位址處於同乙個網段上的客戶程式才能與該服務程式通訊。我們用0來填充 sin_zero陣列,目的是讓sockaddr_in結構的大小與sockaddr結構的大小一致。下面是乙個bind函式呼叫的例子:
struct sockaddr_in saddr;
saddr.sin_family = af_inet;
saddr.sin_port = htons(8888);
saddr.sin_addr.s_addr = htonl(inaddr_any);
bind(listensocket,(struct sockaddr *)&saddr,sizeof(saddr));
網路程式設計socket之bind函式
摘要 在套介面中,乙個套接字只是使用者程式與核心互動資訊的樞紐,它自身沒有太多的資訊,也沒有網路協議位址和 埠號等資訊,在進行網路通訊的時候,必須把乙個套接字與乙個位址相關聯,這個過程就是位址繫結的過程。許多時候核心會我們自動繫結乙個位址,然而有時用 戶可能需要自己來完成這個繫結的過程,以滿足實際應...
網路程式設計socket之bind函式
摘要 在套介面中,乙個套接字只是使用者程式與核心互動資訊的樞紐,它自身沒有太多的資訊,也沒有網路協議位址和埠號等資訊,在進行網路通訊的時候,必須把乙個套接字與乙個位址相關聯,這個過程就是位址繫結的過程。許多時候核心會我們自動繫結乙個位址,然而有時使用者可能需要自己來完成這個繫結的過程,以滿足實際應用...
網路程式設計socket之bind函式
摘要 在套介面中,乙個套接字只是使用者程式與核心互動資訊的樞紐,它自身沒有太多的資訊,也沒有網路協議位址和埠號等資訊,在進行網路通訊的時候,必須把乙個套接字與乙個位址相關聯,這個過程就是位址繫結的過程。許多時候核心會我們自動繫結乙個位址,然而有時使用者可能需要自己來完成這個繫結的過程,以滿足實際應用...