Linux网络编程基础:bind函数

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)转换前后字节内容不变

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没事儿站站桩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值