ZBLOG

写一个c++函数实现类似golang DialTimeout功能的代码

以下是一个简单的 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 地址需要进行适当修改。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:http://sdn.0voice.com/?id=966

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?