以下是一个简单的 C++ 函数,实现了类似 Go 语言中 DialTimeout 的功能:
#include <iostream>
#include <string>
#include <chrono>
#include <thread>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
bool connect_timeout(const std::string& host, int port, int timeout_ms)
{
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
return false;
}
sockaddr_in addr{};
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
inet_pton(AF_INET, host.c_str(), &addr.sin_addr);
fd_set writefds;
FD_ZERO(&writefds);
FD_SET(sockfd, &writefds);
timeval tv;
tv.tv_sec = timeout_ms / 1000;
tv.tv_usec = (timeout_ms % 1000) * 1000;
bool ret = false;
if (connect(sockfd, (sockaddr*)&addr, sizeof(addr)) == 0) {
// 连接成功
ret = true;
} else if (select(sockfd + 1, nullptr, &writefds, nullptr, &tv) > 0) {
// 套接字可写,连接成功
ret = true;
}
close(sockfd);
return ret;
}
int main()
{
// 测试代码
bool connected = connect_timeout("example.com", 80, 5000); // 连接 example.com:80,并设置超时时间为5秒
if (connected) {
std::cout << "Connected!" << std::endl;
} else {
std::cout << "Connection failed." << std::endl;
}
return 0;
}
该函数的作用是连接指定的主机和端口,并在指定的超时时间内返回连接是否成功。它使用了 select 函数来实现非阻塞式等待,从而实现了超时功能。
需要注意的是,该函数仅适用于 IPv4 地址,对于 IPv6 地址需要进行适当修改。