【问题标题】:Can descriptors for sockets be converted to File Pointers?可以将套接字的描述符转换为文件指针吗?
【发布时间】:2011-12-08 12:30:57
【问题描述】:

我通过以下方式获得了 TCP 套接字的描述符:

int desc = accept(socket_descriptor, &client_address, &len)

现在从这个描述符desc 我想得到一个文件指针。 fdopen() 可以用在这里吗?

我想要获取文件指针的原因是因为我正在更改将数据写入本地文件的现有代码。现在,我想扩展它的功能,以便它可以选择性地写入 TCP 客户端。我不想重写所有功能,并且正在考虑以某种方式能够使用现有的基础设施。现有函数使用文件指针写入文件。我想知道是否可以在不进行任何更改的情况下将相同的函数写入 TCP 流。

【问题讨论】:

    标签: c tcp posix


    【解决方案1】:

    是的,fdopen() 正是您所需要的。以下是man page 的说法:

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

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

    【讨论】:

    • 大多数文件没有行缓冲,只有stdout。我不确定是否有办法将文件设置为行缓冲,但我相信大多数都会被块缓冲,这应该对套接字更友好。
    • @ChrisLutz:函数是setlinebuf。我认为stdout 仅在连接到终端时才进行行缓冲,但我不确定。
    • @DietrichEpp - 谢谢。我认为您对stdout 的看法是正确的。
    • 我担心“流的模式必须与文件描述符的模式兼容”这行。我应该在我的场景中使用“w”吗?
    • @AnkurVj:你为什么不试试呢?如果文本和二进制文件的处理方式不同(即在 Windows 上),我建议以“w+”或“bw+”开头。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 2014-04-25
    • 2010-10-05
    • 2014-04-17
    相关资源
    最近更新 更多