connect函数 超时设置和错误码

connect函数

错误返回类型:
Linux下:
EBADF:参数socket未指定一个合法的描述符
ENOTSOCK 参数socket未指定一个套接字描述符
EAFNOSUPPORT 远程端点指定的地址族不能与这种类型的套接字一起使用
EADDRNOTAVAIL:指定的地址不可用
EISCONN:套接字已被连接
ETIMEDOUT:(只用于TCP)协议因未成功建立一个连接而超时
ECONNREFUSED:(只用于TCP)连接被远程机器拒绝
ENETUNREACH:(只用于TCP)网络当前不可到达
EADDRINUSE:指定的地址正在使用
EINPROGRESS:(只用于TCP)套接字是非阻塞的,且一个连接尝试将被阻塞
EALREADY:(只用于TCP)套接字是非阻塞的,且调用将等待前一个连接尝试完成

connect超时设置
虽然内核参数有超时设置,但是超时时间太长,手动改内核参数不太现实。这里运用select结合非阻塞设置超时如下:
1. 将套接字设置非阻塞
fcntl(sock_fd,F_SETFL,fcntl(sock_fd,F_GETFL,0)|O_NONBLOCK););
2. 调用connect函数,判断返回值
3. 若返回值为-1,若错误类型是EINPROGRESS,监听套接字的可写状态,调用select监听是否超时。
4. 若继续进行send,recv最好将套接字设置为阻塞。

在 CSDN 开发的 C 知道 中,您可以使用一些套接字选项来设置 TCP 连接的超时时间。一种常用的方法是使用 `connect()` 函数之前,使用 `setsockopt()` 函数设置 `SO_RCVTIMEO` 或 `SO_SNDTIMEO` 选项。 以下是一个示例代码片段,展示了如何设置连接超时时间为 5 秒: ```c #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> int main() { int sockfd; struct sockaddr_in server_addr; int connect_timeout = 5; // 超时时间为 5 秒 // 创建套接字 sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { perror("socket"); exit(1); } // 设置连接超时选项 struct timeval timeout; timeout.tv_sec = connect_timeout; timeout.tv_usec = 0; if (setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)) == -1) { perror("setsockopt"); exit(1); } if (setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout)) == -1) { perror("setsockopt"); exit(1); } // 设置服务器地址 server_addr.sin_family = AF_INET; server_addr.sin_port = htons(8080); // 设置服务器端口号 server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 设置服务器 IP 地址 // 连接服务器 if (connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) { perror("connect"); exit(1); } // 连接成功,进行后续操作 // 关闭套接字 close(sockfd); return 0; } ``` 在上述示例中,我们使用了 `setsockopt()` 函数设置 `SO_RCVTIMEO` 和 `SO_SNDTIMEO` 选项,将超时时间设置为 5 秒。这样,在调用 `connect()` 函数时,如果连接超时或者连接过程中发生错误,会返回相应的错误码。 请注意,以上代码仅用于演示如何设置连接超时时间,实际应用中可能需要根据具体情况进行适当修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值