C语言|C语言 bind()函数案例详解
bind()函数介绍
在建立套接字文件描述符成功后,需要对套接字进行地址和端口的绑定,才能进行数据的接收和发送操作。
函数原型
bind()函数将长度为addlen的struct sockadd类型的参数my_addr与sockfd绑定在一起,将sockfd绑定到某个端口上,如果使用connect()函数则没有绑定的必要。绑定的函数原型如下:
#include#includeint bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);
bind()函数有3个参数。
- 第1个参数sockfd是用socket()函数创建的文件描述符。
- 第2个参数my_addr是指向一个结构为sockaddr参数的指针,sockaddr中包含了地址、端口和IP地址的信息。在进行地址绑定的时候,需要弦将地址结构中的IP地址、端口、类型等结构struct sockaddr中的域进行设置之后才能进行绑定,这样进行绑定后才能将套接字文件描述符与地址等接合在一起。
- 第3个参数addrlen是my_addr结构的长度,可以设置成sizeof(struct sockaddr)。使用sizeof(struct sockaddr)来设置套接字的类型和其对已ing的结构。
bind()函数的返回值为0时表示绑定成功,-1表示绑定失败,errno的错误值如表1所示。
值 | 含义 | 备注 |
---|---|---|
EADDRINUSE | 给定地址已经使用 | |
EBADF | sockfd不合法 | |
EINVAL | sockfd已经绑定到其他地址 | |
ENOTSOCK | sockfd是一个文件描述符,不是socket描述符 | |
EACCES | 地址被保护,用户的权限不足 | |
EADDRNOTAVAIL | 接口不存在或者绑定地址不是本地 | UNIX协议族,AF_UNIX |
EFAULT | my_addr指针超出用户空间 | UNIX协议族,AF_UNIX |
EINVAL | 地址长度错误,或者socket不是AF_UNIX族 | UNIX协议族,AF_UNIX |
ELOOP | 解析my_addr时符号链接过多 | UNIX协议族,AF_UNIX |
ENAMETOOLONG | my_addr过长 | UNIX协议族,AF_UNIX |
ENOENT | 文件不存在 | UNIX协议族,AF_UNIX |
ENOMEN | 内存内核不足 | UNIX协议族,AF_UNIX |
ENOTDIR | 不是目录 | UNIX协议族,AF_UNIX |
EROFS | socket节点应该在制度文件系统上 | UNIX协议族,AF_UNIX |
#define MY_SOCK_PATH "/somepath"int main(int argc, char *argv[]){int sfd; struct sockaddr_un addr; //AF_UNIX对应的结构sfd = socket(AF_UNIX, SOCK_STREAM, 0); //初始化一个AF_UNIX族的流类型socketif (sfd == -1) { //检查是否正常初始化socketperror("socket"); exit(EXIT_FAILURE); }memset(&addr, 0, sizeof(struct sockaddr_un)); //将变量addr置0addr.sun_family = AF_UNIX; //协议族为AF_UNIXstrncpy(addr.sun_path, MY_SOCK_PATH, sizeof(addr.sun_path)-1); //复制路径到地址结构perror("bind"); exit(EXIT_FAILURE); }... //数据接收发送及处理过程close(sfd); //关闭套接字文件描述符}
示例2 使用结构struct sockaddr_in绑定一个AF_INET族的流协议,先将结构struct sockaddr_in的sin_family设置为AF_INET,然后设置端口,接着设置一个IP地址,最后进行绑定。
#define MYPORT 3490int main(int argc, char *argv[]){int sockfd; //套接字文件描述符变量struct sockaddr_in my_addr; //以太网套接字地址结构sockfd = socket(AF_INET, SOCK_STREAM, 0); //初始化socketif (sockfd == -1) {peeror("socket"); //检查是否正常初始化socketexit(EXIT_FAILURE); }my_addr.sin_family = AF_INET; //地址结构的协议族my_addr.sin_port = htons(MYPORT); //地址结构的端口地址,网络字节序my_addr.sin_addr.s_addr = inet_addr("192.168.1.150"); //IP,将字符串的IP地址转化为网络字节序bzero(&(my_addr.sin_zero), 8); //将my_addr.sin_zero置为0if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr)) == -1) { // 判断是否绑定成功perror("bind"); exit(EXIT_FAILURE); }... //接收和发送数据,进行数据处理close(sockfd); //关闭套接字文件描述符}
【C语言|C语言 bind()函数案例详解】到此这篇关于C语言 bind()函数案例详解的文章就介绍到这了,更多相关C语言 bind()函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 【生信技能树】R语言练习题|【生信技能树】R语言练习题 - 中级
- 一起来学习C语言的字符串转换函数
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- C语言浮点函数中的modf和fmod详解
- C语言中的时间函数clock()和time()你都了解吗
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- 概率论/统计学|随机变量 的 分布函数 与 概率密度函数 的区别
- C语言解方程的根和判断是否是闰年
- C语言的版本比较
- 【C】题目|【C语言】题集 of ⑥