bind函數用法

MSDN中的bind

 

int bind (
  SOCKET
s,                         
  const struct sockaddr FAR*
name
  int
namelen                       
);

關注第二個參數

The SOCKADDR structure varies depending on the protocol selected. Except for the sa_family field, SOCKADDR contents are expressed in network byte order.

struct sockaddr {
        u_short    sa_family;
        char       sa_data[14];
};   
 

In Windows Sockets 2, the name parameter is not strictly interpreted as a pointer to a SOCKADDR structure. It is presented in this manner for Windows Sockets compatibility. The actual structure is interpreted differently in the context of different address families. The only requirements are that the first u_short is the address family and the total size of the memory buffer in bytes is namelen

The structure below is used with TCP/IP. Other protocols use similar structures.

struct sockaddr_in {
        short   sin_family;//對應sa_family
        u_short sin_port;//2個字節
        struct  in_addr sin_addr;//4個字節
        char    sin_zero[8];//8個字節
};

 

這個結構是根據sa_family的不同而不同的,在TCP/IP中就是對應struct sockaddr_in,可以看到兩個結構的大小其實是一樣的,指針轉換起來毫無壓力·~

 

附帶個例子

int bind(
SOCKET s,
const struct sockaddr FAR *name,
int namelen
);

當創建了一個Socket以後,套接字數據結構中有一個默認的IP地址和默認的端口號。一個服務程序必須調用bind函數來給其綁定一個IP地址和一個特定的端口號。客戶程序一般不必調用bind函數來爲其Socket綁定IP地址和斷口號。該函數的第一個參數指定待綁定的Socket描述符;第二個參數指定一個sockaddr結構,該結構是這樣定義的:
struct sockaddr {
u_short sa_family;
char sa_data[14];
};

其中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地址處於同一個網段上的客戶程序才能與該服務程序通信。下面是一個bind函數調用的例子:
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(8888);
saddr.sin_addr.s_addr = htonl(INADDR_ANY); //不用理其他成員了,因爲已經是4字節了~~

bind(ListenSocket,(struct sockaddr *)&saddr,sizeof(saddr));

 

註解:

htonl()將主機的無符號長整形數轉換成網絡字節順序。

INADDR_ANY就是指定地址爲0.0.0.0的地址,這個地址事實上表示不確定地址,或“所有地址”、“任意地址”。 一般來說,在各個系統中均定義成爲0值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章