TCP通信中客户端调用connect函数时非阻塞式处理 一. 简介本文简单学习一下TCP网络通信中客户端 connect函数时非阻塞实现。二. TCP通信中客户端调用connect函数时非阻塞式处理1. connect函数connect函数是 TCP 客户端用于与服务器建立连接的核心系统调用其作用是发起 TCP 三次握手建立与目标服务器的可靠连接。connect 函数是客户端 client 在连接服务器时进行连接时用的。2. TCP通信中客户端调用connect函数时非阻塞式处理非阻塞模式下connect会立即返回-1并设置errnoEINPROGRESSLinux或WSAEWOULDBLOCKWindows表示连接正在进行中需通过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);

相关新闻

最新新闻

Allegro Skill过孔助手:提升高速PCB布线效率

Allegro Skill过孔助手:提升高速PCB布线效率

1. 凡亿Allegro Skill布线功能概述凡亿Allegro Skill布线功能是针对Cadence Allegro PCB设计软件开发的一系列自动化工具集,其中"过孔助手"是专门用于提升高速PCB设计中过孔布置效率的实用功能模块。作为一名使用Allegro进行PCB设计超过8年的硬件工程师&a…

2026/7/29 20:59:39
黑苹果深度解析:从硬件兼容到系统优化的完整技术指南

黑苹果深度解析:从硬件兼容到系统优化的完整技术指南

黑苹果深度解析:从硬件兼容到系统优化的完整技术指南 【免费下载链接】Hackintosh Hackintosh long-term maintenance model EFI and installation tutorial 项目地址: https://gitcode.com/gh_mirrors/ha/Hackintosh 对于希望在普通PC上运行macOS的技术爱好…

2026/7/29 20:59:39
Agilent N7768A 四通道多模光衰减器模块

Agilent N7768A 四通道多模光衰减器模块

产品现已停产,品牌后续变更为 Keysight,属于 N7700 系列模块化光学测试组件,市场流通均为二手模块,无法独立运行。 一、核心技术规格(标准配置,23℃5℃) 通道数量:4 通道&#xff0c…

2026/7/29 20:59:39
选型不头秃:线艺BCR-802JLC与同于科技过招

选型不头秃:线艺BCR-802JLC与同于科技过招

智能硬件在射频电路设计中,电感选型往往让硬件工程师和采购人员“头秃”。线艺(Coilcraft)作为磁性元件领域的标杆,其BCR-802JLC射频电感在业界享有盛誉。然而,随着供应链安全与成本控制的需求日益增长,国产…

2026/7/29 20:59:39
Palworld存档工具终极指南:三步完成存档转换,轻松备份修复你的游戏进度

Palworld存档工具终极指南:三步完成存档转换,轻松备份修复你的游戏进度

Palworld存档工具终极指南:三步完成存档转换,轻松备份修复你的游戏进度 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools 你…

2026/7/29 20:59:39
计算机毕业设计之基于ECharts的电脑销售信息可视化平台设计与实现

计算机毕业设计之基于ECharts的电脑销售信息可视化平台设计与实现

本研究旨在设计并实现一个基于ECharts的电脑销售信息可视化平台,以应对电商平台日益增长的数据处理和分析需求。系统利用Hadoop、Python和大数据的分布式存储和并行计算能力,结合Hive、HBase、Spark等组件,ECharts可视化技术、实现了对海量电…

2026/7/29 20:54:39

月新闻