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

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
std::bind函数可以将可调用对象和其参数进行绑定,并返回一个绑定后的函数对象。绑定的结果可以使用std::function保存。它可以用于绑定普通函数、成员函数以及函数对象,并且可以通过占位符来指定参数的位置。 当绑定普通函数时,std::bind的第一个参数是函数名,普通函数做实参时会隐式转换成函数指针。例如,std::bind(my_divide,_1,2)等价于std::bind(&my_divide,_1,2),其中_1表示占位符,位于std::placeholders中。调用绑定后的函数对象时,传入的参数将替换占位符的位置,实现参数的绑定。 而当绑定成员函数时,std::bind的第一个参数是成员函数的地址,后续参数是成员函数调用时需要传入的参数。通过占位符来指定参数的位置。调用绑定后的函数对象时,传入的参数将替换占位符的位置,实现参数的绑定。 总结而言,std::bind函数可以将可调用对象和其参数进行绑定,以创建一个新的函数对象。这个新的函数对象可以方便地进行参数的绑定,减少传入参数的个数,使得代码更加灵活和易读。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [C++11 std::bind](https://blog.csdn.net/mayue_web/article/details/87915389)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [C++11中的std::bind 简单易懂](https://blog.csdn.net/Jxianxu/article/details/107382049)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

没事儿站站桩

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

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

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

打赏作者

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

抵扣说明:

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

余额充值