Posix API原理返回值说明

news2024/11/24 17:02:35

文章目录

  • 1、概述
  • 2、connect函数
  • 3、listen函数
  • 4、accept返回值处理
  • 5、recv返回值处理
    • 5.1、LT\ET模式读取数据
  • 6、send返回值处理

1、概述

主要介绍网络编程中,使用到的一些系统调用解释,以及返回值的说明

2、connect函数

connect函数功能为,客户端主动向服务器发起连接请求,建立连接时通过三次握手,这个三次握手的过程时由TCP协议栈完成的,不是这个函数做的,这个函数只是通知协议栈要进行三次握手了,这个函数会阻塞等待,三次握手成功或者失败超时则返回

int connectfd = socket(AF_INET, SOCK_STREAM, 0);
int ret = connect(connectfd, (struct sockaddr *)&addr, sizeof(addr));
// ret == -1 && errno == EINPROGRESS 正在建立连接
// ret == -1 && errno = EISCONN 连接建立成功

正在建立连接中
在这里插入图片描述
连接建立成功
在这里插入图片描述

3、listen函数

在这里插入图片描述

listen函数 主要是服务端,用来被动监听套接字上是否有连接请求,backlog参数,主要是用来设置内核中队列大小,不同系统含义不同,Linux中,这个参数表示已完成连接队列大小,如果时mac系统,这个参数表示的是已完成队列和未完成队列的和,未完成队列:主要存放,发送第一次握手的客户端,完成队列:主要存放,完成三次握手的客户端。accept函数也是直接取完成队列中取

4、accept返回值处理

EAGAIN

对accept、send和recv而言,事件未发生时errno通常被设置成EAGAIN(意为“再来一次”)或者EWOULDBLOCK(意为“期待阻塞”),accept()没准备好,这个EAGAIN错误EWOULDBLOCK是一样的

ECONNABORTED

ECONNRESET错误则发生在对方意外关闭套接字后【您的主机中的软件放弃了一个已建立的连接–由于超时或者其它失败而中止接连(用户插拔网线就可能有这个错误出现)】,该错误被描述为“software caused connection abort”,即“软件引起的连接中止”。原因在于当服务和客户进程在完成用于 TCP 连接的“三次握手”后,客户 TCP 却发送了一个 RST (复位)分节,在服务进程看来,就在该连接已由 TCP 排队,等着服务进程调用 accept 的时候 RST 却到达了。POSIX 规定此时的 errno 值必须 ECONNABORTED。源自 Berkeley 的实现完全在内核中处理中止的连接,服务进程将永远不知道该中止的发生。服务器进程一般可以忽略该错误,直接再次调用accept。

EMFILE或者ENFILE

EMFILE:进程的fd已用尽【已达到系统所允许单一进程所能打开的文件/套接字总数】

ENOSYS

accept4()函数没实现

ECONNABORTED

对方关闭套接字

5、recv返回值处理

recv返回值为0

表示客户端正常完成4次挥手断开连接

errno == EAGAIN || errno == EWOULDBLOCK

EAGAIN和EWOULDBLOCK[【这个应该常用在hp上】应该是一样的值,表示没收到数据,一般来讲,在ET模式下会出现这个错误,因为ET模式下是不停的recv肯定有一个时刻收到这个errno,但LT模式下一般是来事件才收,所以不该出现这个返回值,不当做错误处理,只是简单返回

errno == EINTR

EINTR错误的产生:当阻塞于某个慢系统调用的一个进程捕获某个信号且相应信号处理函数返回时,该系统调用可能返回一个EINTR错误,我认为LT模式不该出现这个errno,而且这个其实也不是错误,所以不当做错误处理

errno == ECONNRESET

如果客户端没有正常关闭socket连接,却关闭了整个运行程序【真是够粗暴无理的,应该是直接给服务器发送rst包而不是4次挥手包完成连接断开】,那么会产生这个错误

errno == EBADF

因为多线程,偶尔会干掉socket,所以不排除产生这个错误的可能性

5.1、LT\ET模式读取数据

LT模式

m_read_idx当前读了多少字节
m_read_buf 存储读取数据的数组
READ_BUFFER_SIZE 最多读取这么多
因为LT模式主要读缓冲区中有内容就会一直触发,所以每次读取完之后立刻返回

ET模式

因为ET模式,是不管你有没有处理这个消息都只会触发一次,所以我们需要一直读,直到将数据全部读取完才退出

    if (m_read_idx >= READ_BUFFER_SIZE)
    {
        return false;
    }
    if(m_read_idx<0)
        return false;
    int bytes_read = 0;
    
    //LT读取数据
    if (0 == m_TRIGMode)
    {
        bytes_read = recv(m_sockfd, m_read_buf + m_read_idx, READ_BUFFER_SIZE - m_read_idx, 0);
        m_read_idx += bytes_read;

        if (bytes_read <= 0)
        {
            return false;
        }
        //printf("bytes_read:%d\n",bytes_read);
        // printf("读取全部数据:%s\n",m_read_buf);
        return true;
    }
    //ET读数据
    else
    {
        while (true)
        {
            bytes_read = recv(m_sockfd, m_read_buf + m_read_idx, READ_BUFFER_SIZE - m_read_idx, 0);
            if (bytes_read == -1)
            {
                if (errno == EAGAIN || errno == EWOULDBLOCK)
                    break;
                return false;
            }
            else if (bytes_read == 0)
            {
                return false;
            }
            m_read_idx += bytes_read;
        }
        return true;
    }

6、send返回值处理

send返回值为0

表示客户端正常完成4次挥手断开连接

errno == EAGAIN

内核缓冲区满,这个不算错误

errno == EINTR

这个应该也不算错误 ,收到某个信号导致send产生这个错误

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/820083.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

牛客网Verilog刷题——VL51

牛客网Verilog刷题——VL51 题目答案 题目 请编写一个十六进制计数器模块&#xff0c;计数器输出信号递增每次到达0&#xff0c;给出指示信号zero&#xff0c;当置位信号set 有效时&#xff0c;将当前输出置为输入的数值set_num。模块的接口信号图如下&#xff1a; 模块的时序图…

CS人的痛

FDU原题详情请见&#xff1a;机试合集&#xff0c;选取一些学习的&#xff0c;求上岸 2022.3---CP1514 概率最大路径 题目描述&#xff1a; 2021.3---CP494 目标和 题目描述&#xff1a;

【雕爷学编程】Arduino动手做(177)---ESP-32 掌控板4

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

M5ATOMS3基础04给ROS2发一个问候(micro-ROS)

参考以往部分历程&#xff1a; 1. esp32与ros2的欢乐启程 2021 2. micro-ROS之esp32与ros2资料&#xff08;freertos&#xff09; 2021 3. esp32发布机器人电池电压到ros2&#xff08;micro-rosCoCube&#xff09; 2022 4. CoCube和Micro-ROS简单案例演示 2022 不需要僵化的…

面试总结(三)

1.进程和线程的区别 根本区别&#xff1a;进程是操作系统分配资源的最小单位&#xff1b;线程是CPU调度的最小单位所属关系&#xff1a;一个进程包含了多个线程&#xff0c;至少拥有一个主线程&#xff1b;线程所属于进程开销不同&#xff1a;进程的创建&#xff0c;销毁&…

交流电气装置防雷接地电阻测量的方案

一、目的 为了保证交流电气装置的安全运行和防止雷电对其造成损坏&#xff0c;需要定期检测其接地装置的接地电阻&#xff0c;评估其接地效果和防雷性能。 二、原理 地凯科技认为&#xff1a;接地电阻是指接地装置与大地之间的电阻&#xff0c;它反映了接地装置与大地的接触…

【104协议】【光伏电站】电站系统中的104协议学习

文章目录 104协议学习I帧S帧U帧ASDU总结&#xff1a;关于各类帧的通俗描述建立流程详细分析 104协议学习 起始一个apdu的总长度不会超过255个字节&#xff1b; 在协议中的第二个字节会记录本apdu的长度&#xff0c;但是这个记录的长度数是除开前面两个字节之外的长读数&#xf…

【C++】开源:Linux端V4L2视频设备库

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Linux端V4L2视频设备库。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下…

笨办法学python3进阶篇pdf,笨办法学python3pdf完整版

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;笨办法学python 3电子书下载&#xff0c;笨办法学python3pdf完整版&#xff0c;今天让我们一起来看看吧&#xff01; 1、笨方法学python习题43 按照你说的 Map是一个类&#xff0c;scene_map是一老胡镇个类实例 scene_…

Scratch 详解 流畅光线追踪(盲区)引擎:角度 + 一次函数 + 区域判断

【提示1】本文将全程使用原版积木实现这一功能&#xff0c;请不要在评论区发送扩展中有相应积木。若喜欢使用扩展&#xff0c;可以自行将本文介绍的方法用扩展积木替代。 【提示2】本文中代码里出现的所有最后带*号的变量&#xff0c;均为私有变量&#xff01; 正文 近日&…

C数据结构——无向图(邻接矩阵方式) 创建与基本使用

源码注释 // // Created by Lenovo on 2022-05-13-上午 9:06. // 作者&#xff1a;小象 // 版本&#xff1a;1.0 //#include <stdio.h> #include <malloc.h>#define MAXSIZE 1000 // BFS队列可能达到的最大长度 #define MAX_AMVNUMS 100 // 最大顶点数typedef enu…

用SpringBoot实现post和get请求(多图)

用SpringBoot实现post和get请求&#xff08;多图&#xff09; 用SpringBoot实现post和get请求创建SpringBoot工程创建controller验证FAQ创建项目后依赖报错Project org.springframework.boot:spring-boot-starter-parent:3.1.2.RELEASE not found more 用SpringBoot实现post和g…

AQS构建锁和同步器的框架

1.概述 AQS全称AbstractQueuedSynchronizer&#xff0c;此类在java.util.concurrent.locks包下面&#xff0c;是一个构建锁和同步器的框架&#xff0c;比如ReentrantLock就是基于AQS来实现的。 2.AQS实现原理 AQS内部有一个由volatile修饰(保证其可见性)的变量state&#xf…

PDF文件忘记密码,怎么办?

PDF文件设置密码分为打开密码和限制密码&#xff0c;忘记了密码分别如何解密PDF密码&#xff1f; 如果是限制编辑密码忘记了&#xff0c;我们可以试着将PDF文件转换成其他格式来避开限制编辑&#xff0c;然后重新将文件转换回PDF格式就可以了。 如果因为转换之后导致文件格式…

Tuxera NTFS2023Mac强大的Mac读写工具

Mac用户在使用NTFS格式移动硬盘时&#xff0c;会遇到无法写入硬盘的情况。要想解决无法写入的问题&#xff0c;很多人选择使用Mac读写软件。面对市面上“众多”的读写硬盘软件&#xff0c;用户应该怎么选择呢&#xff1f;初次接触移动硬盘的伙伴可能不知道移动硬盘怎么和电脑连…

RabbitMQ 教程 | 第6章 RabbitMQ 配置

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 DevO…

科大讯飞 - 基于论文摘要的文本分类与关键词抽取挑战赛(DataWhale-Camp)

文章目录 1、赛题信息2、解决方案2.1 飞桨Baseline&#xff08;提供代码&#xff09;2.2 Bert和调参2.3 chatGLMlora大模型 3、关于DataWhale-NLP 1、赛题信息 提交地址&#xff1a;https://challenge.xfyun.cn/topic/info?typeabstract-of-the-paper&chymfk4uU 项目题目…

我的会议(会议通知)

前言: 我们在实现了发布会议功能&#xff0c;我的会议功能的基础上&#xff0c;继续来实现会议通知的功能。 4.1实现的特色功能&#xff1a; 当有会议要参加时&#xff0c;通过查询会议通知可以知道会议的内容&#xff0c;以及当前会议状态&#xff08;未读&#xff09; 4.2思路…

在Linux中怎么查找文件

2023年8月1日&#xff0c;周二上午 目录 Linux的四种搜索命令find简要说明举例说明拓展阅读locate 简要说明举例说明whereis简要说明举例说明which简要说明举例说明 Linux的四种搜索命令 findlocate&#xff08;不一定内置有&#xff0c;可能要下载mlocate包&#xff09;wher…

【概念理解】HAL库的滴答定时器HAL_Delay()函数的实现原理

来源&#xff1a;bilibili视频 这里写目录标题 概述一、寄存器部分1. 控制和状态寄存器(STK_CTRL)2. 加载值寄存器&#xff08;STK_LOAD&#xff09;3.当前值寄存器&#xff08;STK_VAL&#xff09; 二、代码部分hal_delay()1. hal_initTick()滴答定时器的初始化2. 将七万二传…