bind函数
1)头文件:
#include <sys/types.h>
#include <sys/socket.h>
2)函数定义形式
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
函数功能及返回值
1)将指定了通信协议的套接字文件与自己的IP和端口绑定起来
2)成功:返回 0
3)失败:返回 -1
函数参数
sockfd参数
1)套接字文件描述符,即代表socket函数创建的套接字文件
addrlen参数
1)第二个参数所指向的结构体变量的大小
addr参数
1)指向一个struct sockaddr类型的结构体变量,此结构体成员用于设置要绑定的ip和端口
struct sockaddr结构体
struct sockaddr {
sa_family_t sa_family;
char sa_data[14];
}
结构体名为:sockaddr
成员变量1(sa_family):指定AF_***,表示使用什么协议族的ip格式
成员变量2(sa_data[14]):字符数组,存放ip和端口
2)有一个更容易操作的结构体
struct sockaddr_in结构体
struct sockaddr_in{
sa_family_t sin_family; //指定AF_***,表示使用什么协议族的ip格式
__be16 sin_port; //设置端口号
struct in_addr sin_addr; //设置ip
unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) - sizeof(unsigned short int) - sizeof(struct in_addr)];
};
struct in_addr{
__be32 s_addr; //32位的无符号整型数据
};
此结构体因为成员中设置ip和端口的变量时分开的,所以设置方便,但是bind函数要求的是struct sockaddr类型的结构体变量,所以使用struct sockaddr_in设置以后要将其强制转化为struct sockaddr类型,然后传值给bind函数。
示例:
struct sockaddr_in addr; //首先定义结构体变量
addr.sin_family = AF_INET; //指定协议族为IPV4版本的TCP/IP协议族
addr.sin_port = htons(5006); //指定端口号
addr.sin_addr.s_addr = inet_addr("192.168.1.10"); //指定IP
ret = bind(sockfd,(struct sockaddr*)&addr,sizeof(sddr)); //进行套接字文件/ip/端口的绑定
3)所谓绑定就是让套接字文件在通信时有一个固定的ip和端口考
4)对于TCP通信,服务器端必须绑定ip和端口,只有这样,客户才能主动向服务器发起连接请求
5)对于TCP通信,客户端不需要绑定ip和端口号,可以自动指定,因为在建立连接的过程中,服务器会自动记录客户端的ip和端口号
一些补充
htons函数
#include <arpa/inet.h>
uint16_t htons(uint16_t hostshort);
addr.sin_port = htons(5006);
1)用于将端口号从主机端序转换为网络端序
2)并将端口类型转换为short型
3)参数就是主机端序的端口号
4)兄弟函数:ntohs函数用于将端口号从网络端序转为主机端序;除此之外还有htonl、ntohl函数,除了是将数据转换为long型外其他和htons、ntohs一样
5)关于端口数值的确定:因为全球公认的服务器程序端口号范围为0 ~ 1023,所以为避免冲突不能选取此范围,除此还有:1024 ~ 49151、49152 ~ 65535两个范围,一般服务器程序绑定端口的范围为1024 ~ 49151,客户端的端口都是自动分配的,范围就是49152 ~ 65535
inet_addr函数
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
in_addr_t inet_addr(const char *cp);
addr.sin_addr.s_addr = inet_addr("192.168.1.10");
1)参数:字符串形式的ip
2)用于将点分十进制IP转换为IPV4的32位无符号整型IP
3)将无符号整型IP,从主机端序转换为网络端序
4)最终返回网络端序的,32位无符号整型数IP
struct sockaddr与struct sockaddr_in结构体的区别
1)struct sockaddr是通信底层所要求的结构体变量类型,其包含ip格式/ip/端口号
2)struct sockaddr_in是适用于TCP/IP的结构体变量类型,其也包含ip格式/ip/端口号
3)但为了底层操作方便,赋值给bind函数时需要强制转换
4)为了保持正常的强制转换,两者的字节数大小必须一致
5)转换后,两者第一个变量的字节内容对应,前者第二个变量与后者后三个变量内容对应
6)转换前后字节内容不变