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

网络编程异步connect学习

1、概述

下面问题你会怎么回答

异步connect大致流程是什么?

2、回复

1、创建socket

2、设置socket非阻塞

3、调用connect,并处理返回值

4、调用io复用函数,检测socket可写

5、在Linux环境,要调用getsockopt检测socket是否出错,若没有出错,则连接成功

原因:在linux环境即使连接没有成功,socket也有可能是可写的,所以要调用getsockopt检测下

示例代码

#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <errno.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <arpa/inet.h>#define SERVER_IP "192.168.202.224"
#define SERVER_PORT 8082
#define INVALID_HANDLE_VALUE (-1)int main()
{// 创建非阻塞socketint clientfd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);if(clientfd == INVALID_HANDLE_VALUE){perror("clientfd creation failed");return -1;}// 发起非阻塞的connect,并处理返回值for(;;){struct sockaddr_in servAddr;servAddr.sin_family = AF_INET;servAddr.sin_addr.s_addr = inet_addr(SERVER_IP);servAddr.sin_port = htons(SERVER_PORT);int ret = connect(clientfd, (struct sockaddr*)&servAddr, sizeof(servAddr));if(ret == 0){printf("connect success\n");return 0;}else if(ret == -1){if(errno == EINTR){// 被系统信号打断printf("connect errno EINTR continue\n");continue;}else if(errno == EINPROGRESS || errno == EAGAIN || errno == EWOULDBLOCK){break;}else{printf("connect failed errno:%d\n", errno);return -1;}}}// 使用io复用函数,检测socket是否可写fd_set write_fds;FD_ZERO(&write_fds);FD_SET(clientfd, &write_fds);int max_fd = clientfd + 1;struct timeval tv;tv.tv_sec = 3;tv.tv_usec = 0;if(select(max_fd, NULL, &write_fds, NULL, &tv) != 1){printf("select failed errno:%d\n", errno);return -1;}// 检测socket上是否有错误int err;socklen_t len = sizeof(err);if(getsockopt(clientfd, SOL_SOCKET, SO_ERROR, &err, &len) < 0){close(clientfd);return -1;}if(err == 0){printf("connect success\n");}else{        printf("connect failed err:%d\n", err);}close(clientfd);return 0;
}


学习链接:https://github.com/0voice

http://www.dtcms.com/a/316890.html

相关文章:

  • SpringCloud学习------Hystrix详解
  • java每日精进 8.04【文件管理细致分析】
  • 《手撕设计模式》系列导学目录
  • 仓颉编程语言的基本概念:标识符、变量、注释
  • 信息安全概述--实验总结
  • mcu中的RC振荡器(Resistor-Capacitor Oscillator)
  • 企业高性能web服务器
  • 【docker】UnionFS联合操作系统
  • 2025年渗透测试面试题总结-02(题目+回答)
  • 一种红外遥控RGB灯带控制器-最低价MCU
  • Redis类型之String
  • linux-单用户模式、营救模式
  • 高阶 RAG :技术体系串联与实际落地指南​
  • RHCA03--硬件监控及内核模块调优
  • 【Spring Cloud】-- RestTeplate实现远程调用
  • Java开发时出现的问题---并发与资源管理深层问题
  • 嵌入式开发学习———Linux环境下IO进程线程学习(四)
  • 《嵌入式数据结构笔记(三):数据结构基础与双向链表》
  • 应急响应排查思路
  • MLIR Bufferization
  • JWT 签名验证失败:Java 与 PHP 互操作问题解决方案
  • OpenHarmony 5.0 Settings中wifi删除密码立刻去输入密码连接,连接不上
  • 性能测试终极指南:从指标到实战
  • 自动驾驶中的传感器技术24——Camera(15)
  • Mybatis的应用及部分特性
  • 机器学习——集成学习(Ensemble Learning):随机森林(Random Forest),AdaBoost、Gradient Boosting,Stacking
  • 企业级Redis Cluster部署详解及演练
  • 森赛睿科技成为机器视觉产业联盟会员单位
  • 解决cv::dilate处理后的图像边缘像素出现异常值的问题
  • 结构化设计工具与技术详解