connet()超时连接的一般方

connet()超时连接的一般方

原文地址:http://www.linuxdiyf.com/bbs/viewthread.php?tid=111439&pid=562826&page=1&extra=page%3D#pid562826

LINUX下的方法:

在阻塞套接字的一般情况下,connect ()直到客户端对SYN消息的ACK消息到达之前才会返回。使connect()调用具有超时机制的一个方法是让套接字成为非阻塞的套接字体,然后用select()来等待它完成。
复制内容到剪贴板
代码:
s = socket(AF_INET, SOCK_STREAM, 0);

//下面获取套接字的标志
if ((flags = fcntl(s, F_GETFL, 0)) < 0)

{
    //错误处理
}

//下面设置套接字为非阻塞
if (fcntl(s, F_SETFL, flags | O_NONBLOCK) < 0)

{
    //错误处理
}

if ((retcode = connect(s, (struct sockaddr*)&peer, sizeof(peer)) &&   errno != EINPROGRESS))

{
   //因为套接字设为NONBLOCK,通常情况下,连接在connect()返回
   //之前是不会建立的,因此它会返回EINPROGRESS错误,如果返回
   //任何其他错误,则要进行错误处理
}

if (0 == retcode)

{  //如果connect()返回0则连接已建立
    //下面恢复套接字阻塞状态
    if (fcntl(s, F_SETFL, flags) < 0)

   {
        //错误处理
    }

    //下面是连接成功后要执行的代码
   
    exit(0)
}

FD_ZERO(&rdevents);
FD_SET(s, &rdevents);  //把先前的套接字加到读集合里面
wrevents = rdevents;   //写集合
exevents = rdevents;   //异常集合

tv.tv_sec = 5;  //设置时间为5秒
tv_tv_usec = 0;

retcode = select(s+1, &rdevents, &wrevents, &exevents, &tv);
if (retcode < 0)

{  //select返回错误???
    //错误处理
}
else if (0 == retcode)

{  //select 超时???
    //超时处理
}
esle

{
    //套接字已经准备好
    if (!FD_ISSET(s, &rdevents) && !FD_ISSET(s, &wrevents))

   {
        //connect()失败,进行错处理
    }

    if (getsockopt(s, SOL_SOCKET, SO_ERROR, &err, &len) < 0)

   {
        //getsockopt()失败,进行错处理
    }

    if (err != 0)

   {
        //connect()失败,进行错处理
    }

    //到这里说明connect()正确返回
    //下面恢复套接字阻塞状态
    if (fcntl(s, F_SETFL, flags) < 0)

   {
        //错误处理
    }

    //下面是连接成功后要执行的代码
   
    exit(0)
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果在Socket编程中,调用`connect`函数连接转发端口返回-1,表示连接建立失败。这可能是由于以下几种原因之一导致的: 1. 目标主机或转发端口不可达:请确保目标主机的IP地址和端口号正确,并且目标主机处于可访问状态。还要确保转发端口处于监听状态并且可接受连接。 2. 防火墙或网络配置问题:防火墙或其他网络配置可能会阻止连接。请检查防火墙设置、路由器配置或其他网络设备,确保允许相应的连接。 3. 连接超时:如果连接的目标主机没有响应,`connect`函数可能会超时并返回-1。可以尝试增加超时时间或者检查目标主机是否正常工作。 4. 无效的套接字描述符:请确保使用有效的套接字描述符进行连接。 对于连接失败的情况,你可以通过错误处理来确定具体的失败原因。可以使用`perror`函数打印错误信息,或者通过查看全局变量`errno`来获取错误代码,并使用`strerror`函数将错误代码转换为可读的错误消息。 以下是一个示例代码,展示如何处理`connect`函数返回-1的情况: ```c #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <errno.h> #include <string.h> int main() { // 创建套接字 int sockfd = socket(AF_INET, SOCK_STREAM, 0); // 设置目标主机的IP地址和端口号 struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(8080); server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 连接到目标主机 int connect_result = connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)); // 判断连接状态 if (connect_result == -1) { fprintf(stderr, "连接失败: %s\n", strerror(errno)); // 进行错误处理 close(sockfd); return 1; } // 连接成功,进行通信 printf("连接成功\n"); // 进行数据发送和接收操作 // 关闭套接字 close(sockfd); return 0; } ``` 在上述示例中,如果`connect`函数返回-1,将通过`strerror(errno)`打印错误消息。这样可以更好地了解连接失败的具体原因,并根据需要进行错误处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值