bind()函数完成套接字绑定。该函数的第一个参数是新创建套接字,第二个参数是服务器地址,第三个参数是地址结构大小。在程序中使用INADDR_ANY值作为网络地址,这意味着网络服务器提供者将使用适合的网络地址进行绑定。
如果该函数调用失败,则在调用HandleSocketError()函数之前,应先将套接字关闭。
绑定套接字的程序清单如下。
#define SERVERPORT 5555 //服务器TCP端口
//服务器套接字地址
SOCKADDR_IN addrServ;
addrServ.sin_family = AF_INET;
addrServ.sin_port = htons(SERVERPORT);
addrServ.sin_addr.s_addr = INADDR_ANY;
//绑定套接字
retVal = bind(sServer, (LPSOCKADDR)&addrServ, sizeof(SOCKADDR_IN));
if(SOCKET_ERROR == retVal)
{
closesocket(sServer); //关闭套接字
return HandleSocketError("Failed bind()!"); //错误处理
}
在Windows Sockets中存在三种有关地址的结构。
(1)in_addr为网络地址结构,大小为4个字节。
该结构声明如下:
struct in_addr {
union {
struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { u_short s_w1,s_w2; } S_un_w;
u_long S_addr;
} S_un;
}
在应用程序中,调用inet_ntoa()和inet_add()函数实现,网络地址和“.”点间隔的字符串地址之间的转换。下面程序清单示例,将“.”间隔的字符串地址转为网络地址,和将网络地址转换为“.”间隔的字符串地址的方法。
unsigned long ulAddr = inet_addr("192.168.1.100");
char* pAddr = inet_ntoa(*(in_addr*)(&ulAddr));
(2)SOCKADDR_IN为socket地址结构,包含了地址家族、网络地址和端口等信息。
此结构被Windows Sockets用来指定将要连接本地或者远端的地址。该结构16字节大小,可以与SOCKADDR结构相互转换。
该结构声明如下:
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
q sin_family:地址家族,必须为AF_INET。
q port:端口。
q sin_addr:in_add类型的IP地址。
q sin_zero:填充该结构的大小,使之与SOCKADDR结构大小相同。
(3)SOCKADDR结构
该结构依据所使用协议的不同而不同,被内核用于存储地址,大小16字节。在TCP/IP协议下,使用SOCKADDR_IN结构代替该结构。
该结构声明如下。
struct sockaddr {
u_short sa_family;
char sa_data[14];
};
当调用bind()函数绑定套接字时,将SOCKADDR_IN结构类型强制转换为SOCKADDR结构类型,作为该函数的第二个参数。