关于bind函数~

来源:互联网 发布:鹿晗用什么直播软件 编辑:程序博客网 时间:2024/05/22 12:46

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值。

 

 

 

原创粉丝点击