Dotcpp  >  编程教程  >  TCP协议服务端及代码实现  >  Socket编程之bind函数

Socket编程之bind函数

点击打开在线编译器,边学边练

在完成第一步创建套接字,分配了一个Socket描述符后,服务端的第二步就是使用在这个描述符用Bind绑定


Bind()系统调用的主要用处:

1.服务器向系统注册它的众所周知的地址。面向连接和无连接的服务器在接受客户的请求之前都必须做这一步。 

2.客户可为自己注册一个特定的地址,以便服务器可以用这个有效的地址送回响应。


函数功能:

将监听套接字绑定到本地地址和端口上。

头文件:

#include <winsock2.h>

函数原型:

int bind(int sockfd, const struct sockaddr_in *addr, int addrlen);

返回值类型:

整型

返回值:

成功返回非负值,失败返回-1,最常见的错误一般是端口被占用。需要注意的是,在Linux系统中,1024以下的端口都需要root权限的程序才可以绑定

参数说明:

第一个参数sockfd为上一步创建socket时的返回值。

第二个参数addr 为 sockaddr 结构体变量的指针。该类型的定义原型如下:

struct sockaddr_in {
	short	sin_family;    //协议族,与前面Socket函数中提到的一样,我们这里使用AF_INET
	u_short	sin_port;        //端口号,需要
	struct in_addr	sin_addr;    //IP地址,需要使用网络序
	char	sin_zero[8];    //没有实际意义,只是为了跟SOCKADDR结构在内存中对齐
};

第三个参数addrlen为addr 变量的大小,可由 sizeof() 计算得出。                                            



调用bind函数整体代码的参考代码

struct sockaddr_in serv_addr    //创建结构体变量
servaddr.sin_family=AF_INET;    //sin_family指代协议族和前面讲述socket()的第一个参数的含义相同,取值也需跟socke函数第一个参数值一样。
servaddr.sin_port=htons(2000);    //sin_port存储端口号(使用网络字节顺序,对于htons()函数我们还有单独一章的说明,2000这个端口转换为网络字节序列。
理论上端口号的取值范围为是0到65536,但0到1023的端口一般由系统分配给特定的服务程序,比如Web 服务的端口号为 80所以我们的程序要尽量在 1024~65536 之间分配端口号。

servaddr.sin_addr.s_addr=inet_addr("127.0.0.1");    //将iP地址127.0.0.1也就是本机地址转换为十进制
bind(sockfd,(sockaddr*)&servaddr,sizeof(servaddr));    // 将套接字绑定到本地地址和端口上。





本文固定URL:https://www.dotcpp.com/course/775

Dotcpp在线编译      (登录可减少运行等待时间)