TCP/IP网络编程笔记--套接字和标准I/O

2023-05-16

一、定义:标准I/O是标准C库提供的对文件操作的函数接口

二、常见的标准I/O函数:

1、fopen()

函数原型:FILE *fopen(const char *path,const char *mode)

函数功能:以指定的mode打开指定的流path(注:流就是我们要操作的文件的地址)

返回值:成功则返回指向该流的文件指针,失败则返回NULL,并将错误代码存于error中

常用的mode:

“r”:只读方式打开,打开的文件必须存在

“r+”:读写方式打开,文件必须存在

“w”:只写方式打开,文件不存在则创建,文件存在则清空

“w+”:读写方式打开,文件不存在则创建,文件存在则清空

“a”:只写方式打开,文件不存在则创建,文件存在则将数据追加到文件尾部

“a+”:读写方式打开,文件不存在则创建,文件存在则将数据追加到文件尾部

“rb+”:读写方式打开一个二进制文件,文件必须存在

“rt+”:读写方式打开一个文本文件,文件必须存在

“wb+”:只写方式打开一个二进制文件,文件不存在则创建,文件存在则清空

“wt+”:只写方式打开一个文本文件,文件不存在则创建,文件存在则清空

“ab+”:读写方式打开一个二进制文件,文件不存在则创建,文件存在则将数据追加到文件尾部

“at+”:读写方式打开一个文本文件,文件不存在则创建,文件存在则将数据追加到文件尾部

2、单字符读/写函数:

fgetc()/fputc()

函数原型:int fgetc(FILE *stream)/ int fputc(FILE* stream)

函数功能:从指定的流中读/写一个字符

返回值:成功则返回读/写的字符,失败则返回EOF(-1),对于fgetc(),读到文件末尾也返回EOF

注:返回类型为int是为了能表示EOF,即-1

3、多字符读函数:

fgets()

函数原型:char *fgets(char *buf,int bufsize,char *stream)

函数功能:从指定的流stream中读取指定大小bufsize-1的字符到buf中

返回值:成功或读到文件尾但读入了字符则返回buf,失败或读到文件尾但未读入任何字符则返回NULL

注:fgets函数最多只能读取bufsize-1个字符,在读取结束时,会自动在字符末尾加上一个‘\0’,如果

读取的字符大小bufsize大于该行剩余字符总数时(至少大于2,一个保存字符串结束标识符‘\0’,一个保存换行符‘\n’),

文件将停止读取下一行

4、多字符写函数:

fputs()

函数原型:int fputs(const char *s,FILE *stream)

函数功能:将一个字符串写入到指定的文件中,s为字符串首地址,stream为要写入字符串的流

返回值:成功则返回写入字符的个数,失败则返回-1

注:将字符串写入文件时,若果碰到‘\0’,则停止写入

5、fread()/ fwrite()

函数原型:size_t fread(void *buffer,size_t size,size_t count,FILE *stream)

                size_t fwrite(const void *buffer,size_t size,size_t count,FILE *stream)

函数功能:fread 从指定的流中读取count个size大小的项到buffer中

                fwrite 向指定的流中写入count个size大小的项

返回值:成功则返回真实读取/写入的项数,失败则返回0

6、fseek()

函数原型:int fseek(FILE *stream,long offset,int fromwhere)

函数功能:重定位流(数据流/文件)中的内部指针

返回值:成功则返回0,失败则返回1,并设置error的值,可用perror()函数输出错误

offset:整数表示正向偏移量,负数表示负向偏移量

fromwhere:文件头 SEEK_SET(0)、当前位置 SEEK_CUR(1)、文件尾 SEEK_END(2)

注:fseek中的文件指针,应该指向已经打开的文件,否则会发生错误。如果执行成功,位置指针将指向以fromwhere(偏移起始位置)为基准,偏移offset个字节的位置。如果执行失败,比如offset超过文件自身大小,则不改变位置指针指向的位置

7、fdopen()/ fileno()

函数原型:FILE *fdopen(int fildes,const char *mode)

                int fileno(FILE *stream)

函数功能:fdopen 将文件描述符转换为指定模式的FILE文件指针

                fileno 将文件指针转换为文件描述符

返回值:fdopen 成功返回转换的结构体指针,失败返回NULL

             fileno 成功返回转换后的文件描述符,失败返回-1

注:上述参数mode的选择与fopen函数的打开方式相同

文件描述符:由无符号整数表示,进程用它来表示打开的文件,内核用它来访问文件,其中0、1、2分别表示标准输入,标准输出,标准错误

8、fflush()

函数原型:int fflush(FILE *stream)

函数功能:清除读写缓冲区,强制将缓冲区内的数据写回参数stream指定的文件中,如果参数为NULL,fflush()会将所有打开的文件更新

返回值:成功刷新返回0,指定的流没有缓冲区或只读打开时也返回0.出错时返回EOF

9、feof()

函数原型:int feof(FILE *stream)

函数功能:检查文件流是否读到了尾

返回值:文件结束则返回非零值,否则返回0

10、fclose()

函数原型:int fclose(FILE *stream)

函数功能:关闭一个流

返回值:成功返回0,失败返回EOF

三、标准I/O函数的两个优点:

1、具有良好的可移植性(portability)

为了支持所有操作系统(编译器),这些函数都是按照ANSI C标准定义的。

2、可以利用缓冲来提高性能

在创建套接字时,系统会生成用于I/O的缓冲,而这主要是为了实现TCP协议而设立的,使用标准I/O函数时,会得到额外的缓冲支持,而它的主要目的是为了提高性能。此时数据传输会经过两个缓冲。

性能的提高主要从两方面体现,一方面为传输的数据量。比较一个字节的数据发送10次(10个数据包)的情况和累计10个字节发送1次的情况,发送的数据包中含有头信息,其与数据大小无关,固定格式。即使假设该头信息占用40个字节(实际更大),有无额外的缓冲时需要传递的数据量也会存在360个字节的差别。另一方面是数据向输出缓冲移动的次数。这中间消耗的时间也会有较大的差别。

四、标准函数的几个缺点:

1、不容易进行双向通信

2、有时可能频繁调用fflush函数

3、需要以FILE结构体指针的形式返回文件描述符

打开文件时,如果希望同时进行读写操作,则应以r+、w+、a+模式打开,但因为缓冲的缘故,每次切换都写工作时应调用fflush函数,这会影响给予缓冲的性能提高。而且为了使用标准I/O函数,需要FILE结构体指针,而创建套接字时默认返回文件描述符,因此需要将文件描述符转换为FILE指针。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP/IP网络编程笔记--套接字和标准I/O 的相关文章

  • 欢迎访问我的主博(http://shiyangxt.cnblogs.com)

    JavaEye的朋友 xff0c 大家好 我是一名大二的学生 xff0c 对编程技术怀有很大的热情 我的技术方向是Java xff0c 但是我的主博并不在这里 xff0c 而在博客园 xff0c 欢迎大家访问我的主博 施杨de编程世界 我渴
  • Linux应用编程---14.UDP服务器、客户端编程

    Linux应用编程 14 UDP服务器 客户端编程 之前有介绍过UDP是一种无连接 尽最大努力交付 面向报文的协议 应用层交给UDP多长的报文 xff0c UDP就照样发送 Linux下UDP属于数据报socket 数据报socket流程图
  • 0816网络编程day5

    include lt stdio h gt include lt sys types h gt include lt sys socket h gt include lt arpa inet h gt include lt netinet
  • STL容器特征

    STL中顺序容器类和关联容器类的主要特征如下 xff1a 1 vector 内部数据结构 xff1a 数组 随机访问每个元素 xff0c 所需要的时间为常量 在末尾增加或删除元素所需时间与元素数目无关 xff0c 在中间或开头增加或删除元素
  • 数据结构——不带头结点的单链表的基本操作

    数据结构 不带头节点的单链表的基本操作 结构体的创建 xff1a span class token keyword typedef span span class token keyword struct span SListNode sp
  • HTTP请求/响应报文结构

    HTTP请求 响应报文结构 HTTP请求报文 一个HTTP请求报文由四个部分组成 xff1a 请求行 请求头部 空行 请求数据 1 请求行 请求行由请求方法字段 URL字段和HTTP协议版本字段3个字段组成 xff0c 它们用空格分隔 比如
  • C语言练习笔记 ~结构体2 ~ 结构体在内存中的对齐说明

    文章目录 1 结构体变量在内存中的对齐说明例1 1个char型变量例2 2个char型变量例3 1个int型变量例4 1个char型变量和1个int型变量例5 3个char型变量和1个int型变量例6 5个char型变量和1个int型变量例
  • 思岚激光雷达+cartographer建图

    系统环境 xff1a Ubuntu18 04 ROS Melodic gcc 7 5 0 1 安装思岚ROS包 1 1 clone并编译 cd catkin ws src git clone https github com Slamtec
  • 使用PyTorch+functorch计算并可视化NTK矩阵

    2022年3月 xff0c PyTorch发布了PyTorch1 11和functorch functorch灵感来自于Google JAX xff0c 旨在提供vmap和autodiff转换配合PyTorch使用 本文将演示如何使用PyT
  • libcurl异步请求+http长连接池

    由于公司项目 xff0c 需要localhost的形式高并发的http访问本机服务 xff0c 所以面临了两方面的问题 xff1a 1 http短连接会造成大量的time wait xff0c 影响服务器的性能 2 libcurl easy
  • VC实现http发送get和post请求

    VC实现http发送get和post请求 get请求 首先通过前面介绍的抓包工具获取请求的详细内容 xff0c 然后再通过VC拼接Header xff0c 函数如下 xff1a bool CXXX http get eng mode lt
  • 链表(图文详解)

    链表的概念 链表是一种物理存储结构上非连续 xff0c 非顺序的存储结构 xff0c 数据元素的逻辑顺序是通过链表中的指针链接次序实现的 链表的结构是多式多样的 xff0c 当时通常用的也就是两种 xff1a 无头单向非循环列表 xff1a
  • PCB上能上锡的那层叫什么?

  • C++常用数学函数

    C 43 43 中有个头文件math h xff0c 它是数学函数库 一些数学计算的公式的具体实现是放在math h里 xff0c 为了方便大家使用 xff0c 特在此总结常用的一些函数 1 三角函数 double sin double d
  • LimeSDR实验教程(6) 发射GPS

    下载程序 xff1a git clone https github com osqzss gps sdr sim git 编译安装 xff1a cd gps sdr sim gcc gpssim c lm O3 o gps sdr sim
  • 如何理解引用作为函数的返回值?

    如何理解引用作为函数的返回值 xff1f 1 引用作为函数的返回值时 xff0c 必须在定义函数时在函数名前将 amp 2 用引用作函数的返回值的最大的好处是在内存中不产生返回值的副本 span class token comment 代码
  • 自制合成孔径雷达(2) SDR实现的对比(SDR实现测速雷达)

    我今天查了查资料 xff1a 技术干货 xff1a 用LimeSDR Mini制作一台软件定义多普勒雷达 搜狐汽车 搜狐网 查阅一些文献后 xff0c 笔者想探寻减少雷达系统所需的昂贵模拟前端部件数量的可能性 设计灵感来自于Gregory
  • 自制合成孔径雷达(3) doppler代码解读

    上一篇帖子 xff0c 看完了基于SDR的多普勒雷达 xff0c 就可以看看硬件雷达的多普勒测速的DSP代码了 先看一下这个图 xff1a 我们需要的多普勒频移的测量结果是从混频器 xff08 Multiply Conjugate xff0
  • 各类SDR的USB接口一致性测试

    最近用高带宽示波器测了好几个SDR产品的USB2接口一致性 由于探头数量只有1个 xff0c 所以不能测全所有的项目 但已经包含了最主要的USB眼图 xff08 信号质量 xff09 项目 测试场景 xff1a 待测件包含 xff1a 1
  • Portapack应用开发教程(十八)NavTex接收 D

    上回说到 xff0c 我现在已经做到用自己的gnuradio流图从音频信号做fsk解调 xff0c 得到方波 然后用c程序把方波转为二进制数 又用python把二进制数转为最终的字母 但是遗留问题是python解码 xff0c 起始位如果错

随机推荐

  • Portapack应用开发教程(十八)NavTex接收 E

    我现在已经成功把两部分解码的代码合并到一起 实现的功能是从stdout取出方波的采样点幅度 xff0c 然后把它转为解码输出 include lt stdio h gt include lt string gt include lt mat
  • 使用RTL-SDR和Matlab Simulink玩转软件无线电(二十一)

    3 13 扫描频谱 xff1a 把 25MHz 到 1 75GHz 的信号都收下来 这一节我们会做本章最后一个练习 xff0c 使用一个 RTL SDR 扫描整个频率范围内的信号 对于大多数 RTL SDR 设备来说 xff08 R820T
  • SDR# (SDRSharp)代码讲解 (一)

    SDR 也称SDRSharp 与Linux平台下常用的GQRX类似 xff0c 是目前Windows平台上最常用的频谱观察 xff0c 音频解调软件 xff0c 支持AM FM SSB等多种调制方式 以SDRSharp为基础又派生出了其它一
  • 自动跟随机器人教程(一)(树莓派、Arduino教程)

    机器人购买链接 xff1a https item taobao com item htm spm 61 a1z38n 10677092 0 0 59a21debCqLXYP amp id 61 532012951368 接下来打算发布一款自
  • 自动跟随机器人教程(二)硬件组装

    本机器人结构应该说比较简单 xff0c 除了上述图片里的4样东西外 xff0c 就是一个USB摄像头和一块航模专用12V锂电池 xff08 与电机电压一致 xff09 xff0c 一共6样东西 所有这些东西都不需要螺丝固定 xff0c 多数
  • LimeSDR 中文教程 (一)

    行业应用及合作请联系 j shao 64 limemicro com xff08 本文所有图片请参考Myriadrf官网原文 xff1a https myriadrf org blog limesdr made simple part 1
  • Linux系统——fork()函数详解(看这一篇就够了!!!)

    fork 函数详解 包看包会 xff01 xff01 xff01 1 fork 简介 函数原型 xff1a pid t fork void xff1b pid t为int类型 xff0c 进行了重载pid t getpid 获取当前进程的
  • HttpURLConnection详解、JSON的使用

    1 Http网络请求方法 Http的请求方法代表了客户端想对服务器进行的操作 xff0c 比如 xff1a POST GET HEAD PUT DELETE TRACE OPTIONS 常用的不过于CRUD四个 增 xff1a PUT 删
  • printf二进制输出

    include lt stdio h gt include lt conio h gt include lt stdlib h gt void main int i 61 31 char s 10 itoa i s 2 转换成字符串 xff
  • 秒懂HTTP之基本认证(Basic Authentication)

    版权申明 非商业目的注明出处可自由转载 博文地址 xff1a https blog csdn net ShuSheng0007 article details 89598299 出自 xff1a shusheng007 系列文章 xff1a
  • Linux内核学习(一)8086编程模型

    本文主要介绍Intel8086系列的编程模型 xff0c 包括分段与分页机制 任务切换过程以及中断处理系统 作为Linux内核学习曲线的起点 xff0c 本文的侧重点在于对于每个主题 xff0c 硬件上是如何实现的 xff0c 以及为软件
  • Ubuntu网络编程——TCP/IP

    常识 xff1a 裸机 xff1a 没有安装操作系统的计算机 如果想在裸机上运行自己所编写的程序 xff0c 就必须用机器语言写程序 桌面操作系统 xff1a windows macOS Linux 服务器操作系统 xff1a Linux
  • RoboMaster电控学习笔记——电机控制(1-CAN)

    Robomaster官方提供了一系列性能强大的直流无刷减速电机及配套电调 xff0c 这里介绍三款步兵上用的电机 amp 电调 M3508电机 amp C620电调 xff0c GM6020电机 xff08 内部集成电调 xff09 xff
  • linux下 在同一个线程建立TCP连接

    要实现在一个线程里建立TCP连接 xff0c 需要注意accept应在connect之后 xff0c 所以我将accept放在了tcp client里 这样 xff0c 才能得到accept返回的fd xff0c 从而进行read span
  • 【cpprestsdk】浅谈cpprestsdk线程池及使用

    cpprestsdk根据include文件夹可以看到共包含两部分内容 xff1a 1 pplx 2 cpprest pplx threadpool h源代码中创建线程池有两种方式 1 通过construct接口创建 xff0c 返回一个un
  • 丹尼带你入坑无人机3 - 四轴配件简介

    知道你的四轴里面每个小东东都是干嘛用的吗 xff1f 麻雀虽小 xff0c 五脏得全 简单说 xff0c 飞控就是大脑 xff0c 它能知道每一时刻无人机的状态 xff0c 并且给下一时刻需要作出的动作发出指令 电调就好比是神经单元 xff
  • Linux内核简单分析(2)——进程调度与切换

    进程的调度与切换是一个很复杂的话题 xff0c 这里我更关心内核是如何实现的 xff0c 而不是使用了什么策略 xff0c 所以只讲进程的组织和切换方式 xff0c 而对调度程序的实现和算法不作分析 进程调度可参考 xff1a Linux进
  • 【矩阵路径】不知道回溯怎么写?进来看模板就对了!

    矩阵路径 不知道回溯怎么写 xff1f 进来看模板就对了 xff01 这几天做了几道回溯算法的题目 xff0c 发现理解递归关键步骤的结果很重要 xff0c 试图摸索出一套模板 xff0c 思考的方法都是搭建好框架 xff0c 然后逐步细想
  • gloox 获取花名册和联系人出席信息

    gloox 之 RosterManager 此类实现了jabber iq roster名空间中的Jabber XMPP花名册操作 它继承了 IqHandler PresenceHandler SubscriptionHandler 和 Pr
  • TCP/IP网络编程笔记--套接字和标准I/O

    一 定义 xff1a 标准I O是标准C库提供的对文件操作的函数接口 二 常见的标准I O函数 xff1a 1 fopen xff08 xff09 函数原型 xff1a FILE fopen xff08 const char path xf