bind()
函数用于将套接字地址(IP 地址和端口号)分配给套接字。通过 bind()
函数,服务器可以指定它将监听哪个 IP 地址和端口号,以便客户端可以连接到它。
作用
- 分配地址:
bind()
函数将一个本地地址(IP 地址和端口号)分配给一个套接字。对于服务器来说,这是必须的步骤,因为服务器需要监听特定的端口,以便接收客户端的连接请求。 - 准备监听:在服务器使用
listen()
函数开始监听连接之前,必须先调用bind()
函数。 - 端口重用:通过
bind()
函数,还可以设置套接字选项来允许端口重用,这在开发调试时非常有用。
函数原型
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数
sockfd
:套接字文件描述符,由socket()
函数返回。addr
:指向sockaddr
结构的指针,包含要绑定的地址和端口信息。对于 IPv4 地址,通常使用sockaddr_in
结构;对于 IPv6 地址,使用sockaddr_in6
结构。addrlen
:addr
结构的长度,通常使用sizeof()
宏来获取。
返回值
- 成功时返回 0。
- 失败时返回 -1,并设置
errno
以指示错误类型。
int m_sockHeartBeatFd;
struct sockaddr_in server_addr;
// 创建套接字
m_sockHeartBeatFd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_sockHeartBeatFd < 0) {
QString strTmp = QString("heart socket create err sockHeartBeatFd = [%1][%2]").arg(QString::number(m_sockHeartBeatFd)).arg(strerror(errno));
LOGD << strTmp;
return false;
}
// 初始化地址结构
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET; // IPv4
server_addr.sin_addr.s_addr = INADDR_ANY; // 监听所有网络接口
server_addr.sin_port = htons(8080); // 监听 8080 端口
// 绑定地址到套接字
if (bind(m_sockHeartBeatFd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("bind failed");
close(m_sockHeartBeatFd);
exit(EXIT_FAILURE);
}
// 后续步骤:监听连接、接受连接等...
// listen(m_sockHeartBeatFd, 5);
// ...