複製鏈接
請複製以下鏈接發送給好友

bind()

鎖定
將一本地地址與一套接口捆綁。本函數適用於未連接的數據報或流類套接口,在connect()listen()調用前使用。當用socket()創建套接口後,它便存在於一個名字空間(地址族)中,但並未賦名。bind()函數通過給一個未命名套接口分配一個本地名字來為套接口建立本地捆綁(主機地址/端口號)。
外文名
bind()
所屬學科
計算機

bind()簡述

將一本地地址與一套接口捆綁。
在windows 環境下為:
#include <winsock.h>
int PASCAL FAR bind( SOCKET sockaddr, const struct sockaddr FAR* my_addr,int addrlen);
在linux 環境下為:
#include <sys/types.h>
#include <sys/socket.h>
/****
*  sockfd:標識一未捆綁套接口的描述字。
*  my_addr:賦予套接口的地址。sockaddr結構定義如下:
*  struct sockaddr{
*    u_short sa_family;
*    char sa_data[14];
*  };
*  addrlen:name名字的長度。
*  返回值:成功返回0,失敗返回-1.
****/
int bind( int sockfd , const struct sockaddr * my_addr, socklen_t addrlen);
參數列表中,sockfd 表示已經建立的socket編號(描述符);
my_addr 是一個指向sockaddr結構體類型的指針;
參數addrlen表示my_addr結構的長度,可以用sizeof操作符獲得。

bind()用法

在Internet地址族中,一個名字包括幾個組成部分,對於SOCK_DGRAM和SOCK_STREAM類套接口,名字由三部分組成:主機地址,協議號(顯式設置為UDPTCP)和用以區分應用的端口號。如果一個應用並不關心分配給它的地址,則可將Internet地址設置為INADDR_ANY,或將端口號置為0。如果Internet地址段為INADDR_ANY,則可使用任意網絡接口,且在有多種主機環境下可簡化編程。如果端口號置為0,則Windows套接口實現將給應用程序分配一個值在1024到5000之間的唯一的端口。應用程序可在bind()後用getsockname()來獲知所分配的地址,但必需注意的是,getsockname()只有在套接口連接成功後才會填寫Internet地址,這是由於在多種主機環境下若干種Internet地址都是有效的。
如果一個應用程序需要把端口捆綁到超過1024~5000範圍的特定端口時,比如rsh需要捆綁到任一保留端口,則可如下編程:
SOCKADDR_IN sin;
SOCKET s;
u_short alport = IPPORT_RESERVED;
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = 0;
for (;;) {
  sin.sin_port=htons(alport);
  if ( bind(s, (LPSOCKADDR)&sin, sizeof(sin)) == 0) {
    /* it worked */
  }
  if (GetLastError() != WSAEADDRINUSE) {
    /* fail */
  }
  alport-;
  if (alport == IPPORT_RESERVED/2) {
    /* fail-all unassigned reserved ports are */
    /* in use. */
  }
}

bind()返回值

如無錯誤發生,則bind()返回0。否則的話,將返回-1,應用程序可通過WSAGetLastError()獲取相應錯誤代碼

bind()錯誤代碼

WSANOTINITIALISED:在使用此API之前應首先成功地調用WSAStartup()。
WSAENETDOWN:套接口實現檢測到網絡子系統失效。
WSAEADDRINUSE:所定端口已在使用中(參見setoption()中的SO_REUSEADDR選項)。
WSAEFAULT:namelen參數太小(小於sockaddr結構的大小)。
WSAEINPROGRESS:一個阻塞的套接口調用正在運行中。
WSAEAFNOSUPPORT:本協議不支持所指定的地址族。
WSAEINVAL:該套接口已與一個地址捆綁。
WSAENOBUFS:無足夠可用緩衝區,連接過多。
WSAENOTSOCK:描述字不是一個套接口。
參見:
connect(), listen(), getsockname(), setsockopt(), socket(), WSACancelBlockingCall().