在完成第一步创建套接字,分配了一个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));    // 将套接字绑定到本地地址和端口上。




点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

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