在完成第一步创建套接字,分配了一个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)); // 将套接字绑定到本地地址和端口上。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程