首页 > 编程语言 >TCP IP网络编程 IO分离

TCP IP网络编程 IO分离

时间:2022-12-31 17:44:48浏览次数:60  
标签:读取 函数 IP 分离 TCP IO EOF

IO流分离

  在《套接字与标准IO》中介绍,调用fopen函数打开文件后,可以与文件进行交换数据。因此可以说调用fopen函数之后创建了"流(stream)",此处的"指"数据流动,但是通常可以理解为"以数据手法为目的的一种桥梁"。

1. IO分离的方法

  在之前的文章中介绍过两种分离IO流的方法,第一种是是在《TCP/IP网络编程(8) 基于Linux的多进程服务器 》中介绍的多进程方式分离IO流,通过调用fork()函数赋值出一个文件描述符,以区分输入和输出中使用的文件描述符;第二种分离是在《套接字与标准IO》中介绍,通过调用fdopen函数,分别创建读模式的FILE结构体指针和写模式的FILE结构体指针,这种方法分离的输出工具和输入工具,因此也可以视为流的分离。

1.2 流分离带来的好处

  在不同的应用场景下,流的分离在目的上有不同的差异,在《TCP/IP网络编程(8) 基于Linux的多进程服务器 》中,流分离的目的为:

  • 通过分开输入过程和输出过程降低代码实现难度
  • 与输入无关的输出操作可以提高速度

《套接字与标准IO》中,流分离的目的:

  • 为了将FILE结构体指针按照读模式和写模式进行区分
  • 可以通过区分读模式和写模式降低实现难度
  • 通过区分IO缓冲提高缓冲性能
1.3 流分离带来的EOF问题

  C的标准IO中EOF的概念:EOF不是一个字符,它只是一个控制条件,函数返回EOF表示当前的调用出现了以下两种情况:

  • 文件达到了末尾
  • 文件读写过程中出现了错误

EOF的定义为: #define EOF (-1)

1.3.1 例如fgets()函数从stream流中读取一个字符:
int fgets(FILE *stream);

函数的读取过程为:

  1. 函数每次调用都返回stream流的下一个字符
  2. 函数的返回类型为 unsigned char,最终会强制转换为int进行返回
  3. 如果读取过程中发生了错误,或者到达了文件的末尾,则会返回EOF,可通过feof函数和ferror函数区分是达到了文件末尾还是发生了错误
1.3.2例如UNIX中的read()函数
ssize_t read(int fd, void *buf, size_t count)

读取过程如下:

  1. 读取成功,返回读取的字节数
  2. 返回0表示到达文件末尾
  3. 读取失败,返回-1
1.4 网络编程中的EOF

  在TCP通信中,调用如下语句:

shutdown(sock, SHUT_WR);

是一种基于半关闭的EOF传递方法,此时即发送了EOF,又保证了输入流不关闭,还可以接受对方的信息。那么在《套接字与标准IO》中,在使用fdopen()的情况下,如何进行半关闭?

示例代码:

标签:读取,函数,IP,分离,TCP,IO,EOF
From: https://www.cnblogs.com/ncepubye/p/17017022.html

相关文章

  • macOS 终端运行提示“Operation not permitted ”解决办法
    终端运行命令后提“示Operationnotpermitted”报错,这个问题一般只有在macOSVentura系统出现比较频繁,或者是从其他版本升级到Ventura的也需要注意这个小问题。解决办法打......
  • How to Maintain Insertion Order of the Elements in Java HashMap?
    https://www.geeksforgeeks.org/how-to-maintain-insertion-order-of-the-elements-in-java-hashmap/ Whenelementsgetfromthe HashMap duetohashingtheorder......
  • visual studio code设置setting.json文件
    #原始设置{"editor.unicodeHighlight.nonBasicASCII":false,"editor.unicodeHighlight.ambiguousCharacters":false,"workbench.preferredDarkColorTh......
  • NioEndpoint_tomcat压测瓶颈
    示意图简述1. tomcat开启端口,通过backlog觉得TCP半连接、全连接的大小。ssl-lnt2. Nioendpoint通过maxConnectlatch控制accept接入通道连接的大小3. ......
  • Linux关闭ipv6 icmp reply
    Linux主机通常会关闭ipv4的icmpreply来防止扫描,增加安全性#临时关闭icmpreplyecho1>/proc/sys/net/ipv4/icmp_echo_ignore_all#永久关闭#在/etc/sysctl.conf文......
  • 安装embedded纯净版的python 3.11以及安装pip
    为了纯净,我在Win10上选择安装了embedded的版本的python3.11,结果为了安装pip倒腾了一早上。现记录如下。 一、安装python3.11从python官网下的,今天的版本是3.11.1,链接......
  • Region 区域
    一、定义XML区域:1.1使用XML设置区域名称<ContentControlprism:RegionManager.RegionName="ContentRegion"/>1.2使用代码设置区域名称<ContentControlx:Na......
  • Mohamed Elfeki-2019-GDPP Learning Diverse Generations Using Determinantal Point
    GDPP:LearningDiverseGenerationsUsingDeterminantalPointProcess#paper1.paper-info1.1MetadataAuthor::[[MohamedElfeki]],[[CamilleCouprie]],[[M......
  • EasyClick IOS 脱机版脚本自动化测试工具发布
    官方文档地址:​​https://ieasyclick.com/iostjdocs​​开发工具:ideaiOS脱机版本产品介绍苹果手机免越狱免硬件自动化脚本编程软件,适合游戏自动化、办公自动化、自动化......
  • 使用 phylip构建进化树
     001、测试数据转换为vcf格式[root@PC1test]#lstest.maptest.ped[root@PC1test]#plink--filetest--recodevcf-iid--outtest   002、将vcf转为p......