bind()

將一本地地址與一套接口捆綁。本函式適用於未連線的數據報或流類套接口,在未命名套接口分配一個本地名字來為套接口建立本地捆綁(主機地址/連線埠號)。

簡述

將一本地地址與一套接口捆綁。
#include <winsock.h>
int PASCAL FAR bind( SOCKET s, const struct sockaddr FAR* name,
int namelen);
s:標識一未捆綁套接口的描述字。
name:賦予套接口的地址。sockaddr結構定義如下:
struct sockaddr{
u_short sa_family;
char sa_data【14】;
};
namelen:name名字的長度。

注釋

函式適用於未連線的數據報或流類套接口,在connect()或listen()調用前使用。當用socket()創建套接口後,它便存在於一個名字空間(地址族)中,但並未賦名。bind()函式通過給一個未命名套接口分配一個本地名字來為套接口建立本地捆綁(主機地址/斷口號)。
在Internet地址族中,一個名字包括幾個組成部分,對於SOCK_PGRAM和SOCK_STREAM類套接口,名字由三部分組成:主機地址,協定號(顯式設定為UDP和TCP)和用以區分套用的連線埠號。如果一個套用並不關心分配給它的地址,則可將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()返回0。否則的話,將返回SOCKET_ERROR,應用程式可通過WSAGetLastError()獲取相應錯誤代碼。
錯誤代碼:
WSANOTINITIALISED:在使用此API之前應首先成功地調用WSAStartup()。
WSAENETDOWN:WINDOWS套接口實現檢測到網路子系統失效。
WSAEADDRINUSE:所定連線埠已在使用中(參見setoption()中的SO_REUSEADDR選項)。
WSAEFAULT:namelen參數太小(小於sockaddr結構的大小)。
WSAEINPROGRESS:一個阻塞的WINDOWS套接口調用正在運行中。
WSAEAFNOSUPPORT:本協定不支持所指定的地址族。
WSAEINVAL:該套接口已與一個地址捆綁。
WSAENOBUFS:無足夠可用緩衝區,連線過多。
WSAENOTSOCK:描述字不是一個套接口。
參見:
connect(), listen(), getsockname(), setsockopt(), socket(), WSACancelBlockingCall().

相關詞條

相關搜尋

熱門詞條

聯絡我們