C语⾔bind()函数案例详解
bind()函数介绍
在建⽴套接字⽂件描述符成功后,需要对套接字进⾏地址和端⼝的绑定,才能进⾏数据的接收和发送操作。
函数原型
bind()函数将长度为addlen的struct sockadd类型的参数my_addr与sockfd绑定在⼀起,将sockfd绑定到某个端⼝上,如果使⽤connect()函数则没有绑定的必要。绑定的函数原型如下:
#include<sys/types.h>
#include<sys/socket.h>
int 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所⽰。
表1 bind的errno值及含义
值含义备注
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
⽰例1
先建⽴⼀个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族的流类型socket
if (sfd == -1) { //检查是否正常初始化socket
perror("socket");
exit(EXIT_FAILURE);
}
memset(&addr, 0, sizeof(struct sockaddr_un));//将变量addr置0
addr.sun_family = AF_UNIX; //协议族为AF_UNIX
strncpy(addr.sun_path, MY_SOCK_PATH, sizeof(addr.sun_path)-1); //复制路径到地址结构
perror("bind");
exit(EXIT_FAILURE);
unix文件系统
}
... //数据接收发送及处理过程
close(sfd); //关闭套接字⽂件描述符
}
⽰例2
使⽤结构struct sockaddr_in绑定⼀个AF_INET族的流协议,先将结构struct sockaddr_in的sin_family设置为AF_INET,然后设置端⼝,接着设置⼀个IP地址,最后进⾏绑定。
#define MYPORT 3490
int main(int argc, char *argv[])
{
int sockfd; //套接字⽂件描述符变量
struct sockaddr_in my_addr; //以太⽹套接字地址结构
sockfd = socket(AF_INET, SOCK_STREAM, 0); //初始化socket
if (sockfd == -1) {
peeror("socket"); //检查是否正常初始化socket
exit(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置为0
if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr)) == -1) { // 判断是否绑定成功
perror("bind");
exit(EXIT_FAILURE);
}
... //接收和发送数据,进⾏数据处理
close(sockfd); //关闭套接字⽂件描述符
}
到此这篇关于C语⾔ bind()函数案例详解的⽂章就介绍到这了,更多相关C语⾔ bind()函数内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。