socket编程过程中,流文件关闭顺序问题

程序片段:

int sock_fd;
FILE *sock_fpo, *sock_fpi, *pipe_fp;

sock_fd = accept(sock_id, NULL, NULL);
        if (sock_fd == -1 )
            oops("accept");
        if ((sock_fpi = fdopen(sock_fd, "r")) == NULL)
            oops("fdopen reading");
        if (fgets(dirname, BUFSIZ - 5, sock_fpi) == NULL)
            oops("reading dirname");
        if ((sock_fpo = fdopen(sock_fd, "w")) == NULL)
            oops("fdopen writing");
        if ((pipe_fp = popen(command, "r")) == NULL)
            oops("popen");
        while ((c = getc(pipe_fp)) != EOF)
            putc(c, sock_fpo);
        pclose(pipe_fp);
        pclose(sock_fpo);
        pclose(sock_fpi);

此程序片段为服务器socket片段,在调试过程中发现。当我将:

 pclose(sock_fpo);
 pclose(sock_fpi);

的顺序改为:

  pclose(sock_fpi);
  pclose(sock_fpo);

无法正确的将数据写到socket,并传递给客户端。

总结:

由于:pipe_fp, sock_fpo, sock_fpi的打开顺序为sock_fpi,sock_fpo,pipe_fp。

一定要以相反的顺序关闭描述符,先打开的后关闭。即:pipe_fp, sock_fpo, sock_fpi。

时间: 2024-10-24 12:23:54

socket编程过程中,流文件关闭顺序问题的相关文章

PHP Socket 编程过程详解

PHP Socket 编程过程详解 Socket用于进程间通信.进程间通信通常基于客户端—服务端模型.此时,客户端—服务端是可以彼此交互的应用程序.客户端和服务端之间的交互需要连接.Socket编程负责的就是为应用程序之间建立可进行交互的连接. 在本文中,我们将学习如何用PHP创建一个简单的客户端—服务端.我们还将学习如何客户端应用程序如何发送消息到服务端,以及如何从服务端接受消息. 使用代码 目的:开发一个客户端用于发送string消息到服务端,服务端将相同的信息反转后返回给客户端. PHP服

socket编程需要哪些头文件

一 三种类型的套接字:1.流式套接字(SOCKET_STREAM)    提供面向连接的可靠的数据传输服务.数据被看作是字节流,无长度限制.例如FTP协议就采用这种.2.数据报式套接字(SOCKET_DGRAM)    提供无连接的数据传输服务,不保证可靠性.3.原始式套接字(SOCKET_RAW)    该接口允许对较低层次协议,如IP,ICMP直接访问. 二 基本套接字系统调有有如下一些:    创建套接字: socket()    绑定本机端口: bind()    建立连接: conne

io流的关闭顺序

一般情况:先打开的后关闭,后打开的先关闭: 另一种情况:看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b. FileWriter fw = new FileWriter( "E:/data//车站一次.csv",true); BufferedWriter bufw = new BufferedWriter(fw); 关闭流(注意顺序): bufw.close(); fw.close(); 此处用BufferedWriter来包装FileWriter,所以应该先关闭bufw,然后

记Windows下初次使用dev C++进行socket编程过程

记初次接触socket编程,在devC++使用Winsock进行socket编程的一个过程,通过在devC++创建2个项目分别是server.client程序项目,感受通过socket使client与server的一次通讯. 1.新建项目与往常不同,不单单是需要创建一个C文件,更是要在连接库中添加 libws2_32 在项目管理中的属性配置连接库,然后在项目中新建server.c 面向连接的C/S程序工作流程(TCP) 使用WSAStartup()函数检查系统协议栈安装情况 使用socket()

stm32使用rt-thread在文件《stm32f1xx_hal.h》中头文件包含顺序引出的错误

@2019-01-24 [小记] 在学习 rt-thread BSP制作过程中,发现文件<stm32f1xx_hal.h>中 Env工具生成的原始顺序 1. #include "stm32f1xx_hal_conf.h" 2. #include <rtthread.h> 这将导致 <stm32f1xx_hal_spi.h> 文件找不到而编译出错,调整顺序后则OK,原因暂不详 原文地址:https://www.cnblogs.com/skullboye

[转载] linux 程序运行过程中替换文件

今天被朋友问及“Linux下可以替换运行中的程序么?”,以前依稀记得Linux下是可以的(而Windows就不让),于是随口答道“OK”.结果朋友发来一个执行结果:(test正在运行中)# cp test2 test cp: cannot create regular file `test': Text file busy 看起来是程序被占用,无法覆盖.于是自己又再做了几个实验: (1)先rm删除正在运行的test,然后cp test2 test就没有错误了.(2)先mv改名正在运行的test,

VS2015--win32工程配置的一些想法之Google Code Style中头文件的顺序

工程大了,有很多的头文件,也要引用很多的库文件. 从我们学习C++写hello world的那一刻起,就知道要包含一些系统文件. 那么顺序如何呢? 在review的时候,感觉自己写的东西就是一坨屎. 看看Google code style中是如何描述include文件顺序的: Names and Order of Includes Use standard order for readability and to avoid hidden dependencies: C library, C++

关于SPI编程过程中遇到的问题

最近手上有个小项目,其中一个功能是要实现STM32与DSP的SPI通信. 从来没有进行过通信编程的我,着实心中有很多烦恼. 首先是对这个SPI的通信协议,协议的定义时序看了很多遍了,但就是不知道怎么用,由于手中资源有限,也无法让我自己去验证,只能在项目的基础上去摸索了. 其次,对于两块处理器芯片的SPI资源的调用方面. STM32通用例程很多,在功能中又是工作在主模式上,所以实现起来还是比较的方便. DSP方面,对于跑程序的处理器,一般不会把它工作在从模式上.然而我很不幸地就要这么子做了. DS

关于s5pv210的配置、编译过程中相关文件的分析(Makefile、config.mk、mkconfig)

uboot为用户提供两种编译方式,一种是在uboot当前目录下进行编译,第二种方式就是将编译生成的文件输出到指定的目录下. 1) Add O= to the make command line # 'make O=/tmp/build all' # # 2) Set environement variable BUILD_DIR to point to the desired location # 'export BUILD_DIR=/tmp/build' # 'make' # # The se