当前位置: 首页 > news >正文

TCP通信中客户端调用connect函数时非阻塞式处理

一. 简介

本文简单学习一下,TCP网络通信中,客户端 connect函数时非阻塞实现。

二. TCP通信中客户端调用connect函数时非阻塞式处理

1. connect函数

connect函数是 TCP 客户端用于与服务器建立连接的核心系统调用,其作用是发起 TCP 三次握手,建立与目标服务器的可靠连接。

connect 函数是客户端 client 在连接服务器时进行连接时用的。

2. TCP通信中客户端调用connect函数时非阻塞式处理

非阻塞模式下,connect会立即返回-1并设置errno=EINPROGRESS(Linux)或WSAEWOULDBLOCK(Windows),表示连接正在进行中,需通过select/epoll等待结果。

下面举例说明,非阻塞模式下 connect函数的处理方式:

int nonblock_connect(const char *server_ip, int port) { int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { perror("socket failed"); return -1; } // 设置套接字为非阻塞模式 int flags = fcntl(sockfd, F_GETFL, 0); fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); struct sockaddr_in server_addr = { .sin_family = AF_INET, .sin_port = htons(port) }; inet_pton(AF_INET, server_ip, &server_addr.sin_addr); // 非阻塞 connect:立即返回,可能失败但需后续检查 int conn_ret = connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)); if (conn_ret == 0) { // 极少数情况:连接立即建立(本地连接) fcntl(sockfd, F_SETFL, flags); // 恢复阻塞模式(可选) return sockfd; } if (errno != EINPROGRESS && errno != EWOULDBLOCK) { // 非阻塞模式下的其他错误(如地址无效) perror("nonblock connect failed immediately"); close(sockfd); return -1; } // 用 select 等待连接完成(超时 5 秒) fd_set writefds; FD_ZERO(&writefds); FD_SET(sockfd, &writefds); struct timeval timeout = {5, 0}; // 5秒超时 int select_ret = select(sockfd + 1, NULL, &writefds, NULL, &timeout); if (select_ret <= 0) { // select 超时或失败 printf("connect timeout or select failed\n"); close(sockfd); return -1; } // 检查连接是否成功(通过 getsockopt 获取错误码) int error = 0; socklen_t error_len = sizeof(error); getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &error_len); if (error != 0) { // 连接失败(错误码为实际失败原因,如 ECONNREFUSED) printf("connect failed (SO_ERROR=%d): %s\n", error, strerror(error)); close(sockfd); return -1; } // 连接成功,恢复阻塞模式(可选,根据需求) fcntl(sockfd, F_SETFL, flags); return sockfd; }

可以看出,客户端 client 进行 非阻塞式 connect 连接时,主要使用函数如下:

int fcntl(int fd, int cmd, ... /\* arg \*/ ); int select(int nfds, fd\_set \*readfds, fd\_set \*writefds, fd\_set \*exceptfds, struct timeval \*timeout);
http://www.jsqmd.com/news/1289284/

相关文章:

  • INAV飞控系统:从零开始的完整配置与调参终极指南
  • 冠县浩鑫塑业:山东珍珠棉生产、异形珍珠棉定制、防震内衬加工、专注珍珠棉定制加工的本土生产企业 - 海棠依旧大
  • 2026碳盘查机构避坑指南!国内5家服务商横向对比,碳阻迹综合实力断层领先 - 互联网科技品牌测评
  • 关系型数据库与 NoSQL 在刷题系统中的选择:MySQL、MongoDB 与 Redis 的分工
  • picocom实战指南:掌握Linux串口通信的6个专业技巧
  • 2026年下半年隔离墩生产厂家综合选型参考 - 优企名品
  • Pixelle-Video:5分钟掌握AI短视频创作,零基础也能制作专业视频
  • PixiJS Live2D插件终极指南:5个核心功能与最佳实践
  • PMC视角下的工厂排产管理:计划每天都在变,PMC如何建立“日滚动、周复盘”的排产机制?
  • FastQC实战指南:如何准确识别测序数据中的隐藏问题
  • 三、constexpr
  • 百度网盘直链解析:智能绕过限速的高效下载解决方案
  • 5分钟上手BeeRef:创作者必备的参考图管理神器
  • 解决传统竞价广告成本高问题,高宇GEO适合谁
  • 如何高效使用Java代码分析工具:专业级反混淆完整指南
  • 视频如何精准融入三维场景:从纹理投影到摄像机位姿求解
  • Pixelle-Video:AI视频创作革命,5分钟从创意到专业短视频
  • UR7002-600型压铸铝双金属散热器如何兼顾“颜值”与“实力”?
  • 2026 天津和平区别墅卫生间防水机构推荐 10 家 合规资质甄选型录、实力维度测评及合作避坑全攻略 - 鼎万建筑修缮
  • 终极指南:3分钟掌握Steam游戏数据提取的完整方法
  • Netscout将DDoS防御能力翻倍,应对AI驱动的僵尸网络威胁
  • SSD用了几年越来越慢?可能不是质量问题,而是这几个原因导致
  • 微信聊天记录备份终极指南:三步永久保存珍贵对话
  • Ultralytics yolo下载
  • 2026年下半年起重机安装服务商选择:制造业与服务业双重视角下的实力解析 - 优企名品
  • Ark-Pets:将明日方舟干员变为你的智能桌面伙伴的终极指南
  • 预约上门康养服务系统开发
  • 自建 AI 服务 vs 调用 API:成本、延迟与可控性的权衡矩阵
  • 2026 年当下,曲靖靠谱的厚壁无缝钢管供货厂家有哪些,用了这玩意儿,工程耐压寿命居然直接翻了三倍还多?-赫凤钢管 - 行业鉴选官
  • Nintendo Switch大气层系统1.7.1:解锁游戏主机的终极自由体验