套接字描述符能转换为文件指针吗?

8
我以以下方式获得TCP套接字的描述符:
``` int desc = accept(socket_descriptor, &client_address, &len) ```
现在我想从这个描述符 `desc` 中获取一个文件指针。可以使用 `fdopen()` 吗?
我想获取一个文件指针的原因是,我正在修改现有代码,该代码将数据写入本地文件。现在,我想扩展其功能,使其可以选择性地写入TCP客户端。我不想重写所有函数,并考虑通过某种方式使用现有基础设施。现有函数使用文件指针将数据写入文件。我想知道是否可能使同一函数在不做任何更改的情况下写入TCP流。
1个回答

10

对的,fdopen() 就是你需要的。这里是 man page 对它的描述:

fdopen() 函数将一个流与现有的文件描述符 fd 关联起来。流的模式(值之一为 "r"、"r+"、"w"、"w+"、"a" 或 "a+")必须与文件描述符的模式兼容。新流的文件位置指示器设置为属于 fd 的指示器,并清除错误和文件结束标识符。模式 "w" 或 "w+" 不会截断文件。文件描述符没有被复制,当由 fdopen() 创建的流关闭时将被关闭。将 fdopen() 应用于共享内存对象的结果是未定义的。

但在应用于套接字描述符时使用时要小心。高级I/O函数使用缓冲区,可能会以不同的方式发送数据(即在流中找到 \n 时刷新,插入 \r 等)。


1
大多数文件都不是行缓冲的,只有 stdout 是。我不确定是否有一种方法可以将文件设置为行缓冲,但我相信大多数都是块缓冲的,这应该更适合套接字。 - Chris Lutz
我关注的是这句话:“流的模式必须与文件描述符的模式兼容”。在我的情况下,我应该使用“w”吗? - AnkurVj
2
@AnkurVj:为什么不试一下呢?如果文本和二进制文件有所不同(即在Windows上),我建议从“w +”或“bw +”开始。 - user405725
我已经尝试过"a+"和"r+"。 "r+"仅适用于Mac OS X / iOS,而"a+"也适用于Linux 3.2.0。 - ZhangChn
@ZhangChn:在Linux上对我有效的是r+。 - user405725
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接