📄 14.3.3 bind函数.txt
字号:
14.3.3 bind函数
在创建了套接字之后,应该将该套接字绑定到本地的某个地址和端口上,这需要通过 bind函数
来实现。该函数的原型声明如下所示 :
int bind( SOCKET s , const struct sockaddr FAR *name, int namelen );
这个函数接收三个参数。第一个参数 ( s )指定要绑定的套接字 ;第二个参数 ( name )指定了
该套接字的本地地址信息,这是一个指向 sockaddr结构的指针变量,由于该地址结构是为所有
的地址家族准备的,这个结构可能 (通常会)随所使用的网络协议不同而不同,
sockaddr结构的定义如下所示 :
struct sockaddr {
u_short sa_family;
char sa_data[14] :
sockaddr结构的第一个字段 (sa_farnily)指定地址家族,对于 TCPIIP协议的套接字,必须设置
为 AF_INET;第二个字段 C s a_data)仅仅是表示要求一块内存分配区,起到占位的作用,该
区域中指定与协议相关的具体地址信息。由于实际要求的只是内存区,所以对于不同的协议家族,
用不同的结构来替换 sockaddr o除了 sa_farnily外, sockaddr是按网络字节顺序表示的。在
基于 TCP_IP的 socket编辑过程中,可以用 sockaddr_in结构替换 sockaddr,以方便我们填写
地址信息。
sockadd_in结构体的定义如下 :
struct sockaddr_in{
short sin_family;
unsigned short sin_port;
struct in_addr sin_addr;
char sin_zero[8] ;
其中sin_family表示地址族,对于IP地址, sin_family成员将一直是AF_INET;成员 sin_port指
定的是将要分配给套接字的端口:成员sin addr给出的是套接字的主机IP地址:成员sin-zero只
是-个填充数,以使sockaddr in结构和sockaddr结构的长度一样。如果这个函数调用成功,它将
运回0。如果调用失败,这个函数就会运回一个SOCKET_ERROR,错误信息可以通过
WSAGetLastErrOf函数返回。
另外, sockaddr_in结构中 sin_addr成员的类型是in addr,该结构的定义如下所示:
struct in_addr {
union {
struct
{
u_char s_b1 , s_b2 , s_b3 , s_b4;
} S_un_b;
struct { u_short s_w工, s_w2 ; } S_u口_W;
u_long S_addr;
} S_un ;
可以看到, in_addr结构实际上是一个联合,通常利用这个结构将一个点分十进制格式的 IP地
址转换为 u_long类型,并将结果赋给成员 S addr。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -