[C++ 网络协议] 套接字和标准I/O

2023-09-21 17:23:27

1. 标准I/O函数的优缺点

优点一:标准I/O函数具有良好的移植性。

为了支持所有系统,标准I/O函数都是按照标准来定义的。适用于所有编程领域。

优点二:标准I/O函数可以利用缓冲提高性能。

使用标准I/O函数会得到额外的缓冲支持,当创建套接字时,操作系统将会生成一个用于I/O的缓冲,同时,当你使用标准I/O函数,将会得到另一缓冲的支持。

得到另一缓冲的支持为什么可以提高性能?

答:并非所有情况下,都能提高性能。需要传输的数据越多,则有无缓冲带来的性能差异越大。从如下两个角度来说,另一缓冲提高了性能:

1.传输的数据量

2.数据向输出缓冲移动的次数

你每write一次,就会将数据移动到套接字的输出缓冲一次,这样

缺点一:不容易进行双向通信

缺点二:有时可能频繁的调用fflush函数

因为缓冲的缘故,每次对文件切换读写工作状态,都需要调用fflush函数。

缺点三:需要以FILE结构体指针的形式返回文件描述符

因为创建套接字时,返回的是文件描述符,但是要使用I/O函数则必须是FILE结构体指针。

2.使用标准I/O函数

2.1 fdopen函数(将文件描述符转换为FILE结构体指针)

#include<stdio.h>

FILE* fdopen(
int files,        //文件描述符
const char* mode  //将要创建的FILE结构体指针的模式信息("w"写,"R"读)
);
成功返回转移的FILE结构体指针,
失败返回NULL

注意:转移后的FILE结构体指针,可以使用fclose关闭文件,此时无需再使用close函数关闭文件描述符。

2.2 fileno函数(将FILE结构体指针转换为文件描述符)

#include<stdio.h>

int fileno(FILE* stream);
成功返回转换后的文件描述符
失败返回-1

2.2 文件操作函数

#include<stdio.h>

FILE* fopen(
const char* path,        //文件名或路径
const char* mode,        //将要创建的FILE结构体指针的模式信息
);
成功返回要打开的文件指向的FILE结构体指针
失败返回NULL
mode含义
r只读方式打开,文件必须存在
w

只写方式打开

若文件存在,则会先清空文件,再进行写。

若文件不存在,则会创建文件

w+

可读写方式打开

若文件存在,则会先清空文件,再进行写。

若文件不存在,则会创建文件

a

只写方式打开,以附加方式

若文件存在,则会将数据写入到文件末尾。(EOF符会保留)

若文件不存在,则会创建文件

a+

可读写方式打开,以附加方式

若文件存在,则会将数据写入到文件末尾。(原来的EOF符不保留)

若文件不存在,则会创建文件

wb只写打开或新建一个二进制文件
wb+读写打开或建立一个二进制文件
ab附加方式打开一个二件事文件,可以在文件末尾写
ab+读写方式打开一个二进制文件,可以在文件末尾写
  • +号表示对文件既可读又可写
  • t表示打开文件类型是文本文件
  • a表示追加原文件数据,而不是覆盖
  • b表示以二进制打开文件

打开文件:

FILE* fopen(const char* path,const char* mode);
成功则返回指向的FILE结构体
失败返回NULL

读字符串:

char* fgets(const void* buffer, size_t size, FILE* stream);
成功,该函数返回相同的 str 参数。
失败,则返回NULL

写字符串:

int fputs(const void* buffer, FILE* stream);
成功返回一个非负值
失败则返回 EOF(-1)

刷新(清空)缓冲区:

int fflush(FILE* stream);
成功返回0。指定的流没有缓冲区或者只读打开时也返回0值。
失败返回EOF。

注意:fflush在清空标准IO函数提供的缓冲区时,也会将缓冲区里的数据立马发送出去。

判断流上的文件是否结束:

int feof(FILE* stream);
如果结束则为0
没结束则非0
更多推荐

解决Vue项目中的“Cannot find module ‘vue-template-compiler‘”错误

1.问题描述在Vue项目中,当我们使用Vue的单文件组件(.vue文件)时,有时会遇到以下错误信息:ERROR:Cannotfindmodule'vue-template-compiler'这个错误通常发生在我们使用Vue的版本不匹配或者缺少必要的依赖模块时。本文将介绍如何解决这个问题。2.解决方法方法一:安装vue-

2023中国智能产业高峰论坛丨文档图像大模型的思考与探索

#前言随着人工智能技术的不断发展,尤其是深度学习技术的广泛应用,多模态数据处理和大模型训练已成为当下研究的热点之一,这些技术也为文档图像智能处理和分析领域带来了新的发展机遇。近期,2023第十二届中国智能产业高峰论坛(CIIS2023)在江西南昌开幕,政企研学各界学者专家同台交流,在成果分享、观点碰撞、经验互鉴中,共促

pytest一些常见的插件

Pytest拥有丰富的插件架构,超过800个以上的外部插件和活跃的社区,在PyPI项目中以“pytest-*”为标识。本篇将列举github标星超过两百的一些插件进行实战演示。插件库地址:http://plugincompat.herokuapp.com/1、pytest-html:用于生成HTML报告一次完整的测试,

GRACE球谐数据滤波处理(利用matlab实现GRACE月水储量的二维傅里叶变化滤波)

GRACE的全球重力场产品以球谐系数(SHCs)的形式表现出明显的南北条带噪声问题,这种噪声被认为来源于它的极轨道、缺乏横向敏感性以及采样频率引起的混叠效应。空间滤波器的例子包括各向同性高斯滤波器(Wahretal.,1998)及其非各向同性变体(Hanetal.,2005;Zhangetal.,2009),维纳滤波器

Springboot 集成WebSocket作为客户端,含重连接功能,开箱即用

使用演示publicstaticvoidmain(String[]args)throwsException{//初始化socket客户端BaseWebSocketClientsocketClient=BaseWebSocketClient.init("传入链接");//发送消息socketClient.sendMess

电磁散射模拟的体积积分方程求解器:使用MATLAB中的ceviche_challenges模块进行光子器件逆向设计详解

第一部分:电磁散射模拟与体积积分方程求解器简介在现代光子学领域,电磁散射模拟是一个核心技术,它涉及到光子器件的设计、分析和优化。为了准确地模拟电磁波在复杂介质中的传播,研究者们开发了多种数值方法。其中,体积积分方程求解器是一个强大的工具,它可以为复杂的光子器件提供精确的模拟结果。MATLAB,作为一个广泛使用的数值计算

讯飞星火认知大模型Java后端接口

文章目录1.免费申请星火大模型套餐2.Java后端接口说明2.1项目地址2.2项目说明2.3项目结构2.4项目代码🍀maven依赖🍀application.yml配置文件🍀config包📌XfXhConfig🍀dto包📌MsgDTO📌RequestDTO📌ResponseDTO🍀listener包📌

详细介绍下路由器的LAN接口

路由器的LAN口(LocalAreaNetworkport)是指用于连接局域网(LAN)设备的接口。它提供了有线连接的接口,允许局域网内的设备通过以太网线连接到路由器,并与其他局域网设备进行通信。以下是对路由器的LAN口的详细介绍:功能:LAN口的主要功能是提供有线网络连接,用于连接局域网内的设备,如台式电脑、网络打印

探索状态驱动开发的奇妙世界——Cola-StateMachine的介绍与使用

文章目录1.前言2.Cola-StateMachine概述3.Cola-StateMachine相关API4.Cola-StateMachine实战5.其他1.前言前面接受了Spring实现的状态机SpringStateMachine,这个状态机的优点在于功能很完备,缺点也是功能十分完备。完备到什么程度了,提供了状态机

ICS TRIPLEX T8310 自动化控制模块

ICSTRIPLEXT8310是一种自动化控制模块,通常用于工业控制和自动化系统中,以实现对各种过程和设备的自动控制。以下是可能包括在ICSTRIPLEXT8310自动化控制模块中的一些常见产品功能:PLC(可编程逻辑控制器)功能:T8310模块通常具备PLC功能,可编程逻辑控制,以实现自动化控制逻辑和任务。多通道输入

C#webform Static DataTable 多人同时操作网页数据重复问题

在C#WebForms中,如果声明一个static变量,它将在整个应用程序域(ApplicationDomain)中保持持久化状态。每个用户的请求都在同一个应用程序域中处理,因此static变量在不同页面间保持相同的值。当一个用户发起请求时,Web服务器会创建一个新的线程来处理该请求,但它仍然在同一个应用程序域中运行。

热文推荐