• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

c语言 搞代码 4年前 (2022-01-06) 32次浏览 已收录 0个评论
文章目录[隐藏]

这篇文章主要介绍了C语言 bind()函数案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

bind()函数介绍

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

函数原型

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

 #include #include int bind(int sockfd, const struct sockaddr *my_addr<span style="color:transparent">来源gaodai#ma#com搞*代#码网</span>, 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); } ... //数据接收发送及处理过程 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()函数内容请搜索gaodaima搞代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持gaodaima搞代码网

以上就是C语言 bind()函数案例详解的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:C语言 bind()函数案例详解

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址