04 TCP套接字之bind的函数

本文详细解析了TCP套接字中bind函数的使用,包括函数原型、参数解释以及常见错误处理。bind函数在服务端网络通信中至关重要,用于将本地协议地址绑定到套接字。通过示例代码展示了如何处理地址已被使用和端口已被绑定的错误情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面介绍了socket函数, 本节介绍bind函数. 该函数是网络通信时服务端必不可少的函数.

函数原型

bind函数把一个本地协议地址赋予一个套接字.

#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

成功 : 返回0.

失败 : 返回-1.

  • bind函数失败最常见的原因是地址已被使用和端口已被绑定, 并且设置errno的值.

    errno的值描述
    EADDRINUSE地址已被使用
    EINVAL端口已被绑定
函数参数
  • sockfd是调用socket函数返回的文件描述符

  • addr是一个通用套接字地址结构

    struct socketaddr{
    	uint8_t sa_len;
        sa_family_t sa_family;
        char sa_data[18];
    };
    

    现在我们探讨的是TCP套接字, 而TCP套接字地址结构如下. 其中**in_addr是linxu中保存IP地址的网络字节序**, 而in_addr_t是由typedef定义的一个32位无符号类型的整数.

    #include <netinet/in.h>
    struct socketaddr_in{
    	uint8_t sa_len;	// 为0
        sa_family_t sa_family;	// 设置域
        in_port_t sin_port;	// 绑定端口
        struct in_addr sin_addr;	// 绑定地址
        char sa_data[18]; // 为0
    };
    
    struct in_addr{
    	in_addr_t s_addr;
    };
    

    但是bind函数的参数只能支持sockaddr结构, 无法传入sockaddr_in结构啊. 想要将TCP的结构传入bind函数只能构通过强制转换的方法.

  • addrlen是参数addr的大小. 而socklen_t类型是一个无符号整数.

函数调用
int ret;
struct sockaddr_in sockaddr;
bzero(&sockaddr, sizeof(sockaddr)); // 全部填0
sockaddr.sa_family = AF_INET;	// 设置域
sockaddr.sin_port = htons(port);	// 绑定端口
sockaddr.sin_addr.in_addr = inet_addr(addr);	// 绑定地址

int sockfd = socket(AF_INET, SOCK_STREAM, 0);
ret = bind(sockfd, (struct sockaddr*)&sockaddr_in, sizeof(sockaddr_in));
if(ret < 0) 
    if(errno == EADDRINUSE)
        EXIT("port impropriate");
	else
        EXIT("bind");

如果想要验证端口被绑定和地址已被使用, 可以使用这里代码来验证bind_error.c . 请将代码中的IP地址写成自己本机的IP地址.

首先来验证地址已被使用, 将代码中的62行注释掉, 接着在两个不同的终端调用该程序, 得到的结果就是 :

在这里插入图片描述

然后验证端口已被绑定的错误, 将62行注释取消, 直接运行一次程序, 结果如下 :

在这里插入图片描述

总结
  • sockfd是从socket函数返回的文件描述符
  • 套接字地址结构一定要强制转化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值