C语言 bind()函数案例详解

  bind()函数介绍

  在建立套接字文件描述符成功后,需要对套接字进行地址和端口的绑定,才能进行数据的接收和发送操作。

  函数原型

  bind()函数将长度为addlen的struct sockadd类型的参数my_addr与sockfd绑定在一起,将sockfd绑定到某个端口上,如果使用connect()函数则没有绑定的必要。绑定的函数原型如下:

  #include

  #include

  int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);

  bind()函数有3个参数。

  表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);

  }

  ... //数据接收发送及处理过程

  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()函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

  您可能感兴趣的文章: