为什么不能在套接字上使用C标准I / O.

时间:2012-08-19 20:24:27

标签: c sockets unix network-programming

通常说在使用套接字时不应使用C标准I / O函数(如fprintf()fscanf())。

我无法理解为什么。我想如果原因只是它们的缓冲性质,那么每次输出时都可以刷新输出缓冲区,对吗?

为什么每个人都使用UNIX I / O功能?在使用标准C函数是否合适且正确的情况下是否存在任何情况?

4 个答案:

答案 0 :(得分:8)

您当然可以将stdio与套接字一起使用。你甚至可以编写一个只使用stdinstdout的程序,从inetd运行它(在STDIN_FILENOSTDOUT_FILENO上提供套接字),以及它工作即使它根本不包含任何套接字代码。

您不能做的是将缓冲I / O与selectpoll混合使用,因为fselect上没有fpollFILE *工作s你甚至不能自己实现一个,因为没有标准的查询FILE *的方法来查明它的输入缓冲区是否为空。

只要您需要处理多个连接,stdio就不够好了。

答案 1 :(得分:3)

如果您在阻塞模式下使用一个套接字并且您的应用程序协议是基于文本的简单方案,则完全没问题。

使用任何类型的二进制编码以及任何真正的性能要求,很快就会成为一个巨大的痛苦,包括多个或非阻塞套接字。

答案 2 :(得分:2)

不知道任何直接异议。最有可能这样做会很好。

同时我可以想象一个平台,其中fprintf()fscanf()有自己的缓冲区,保持在文件描述符层之上。您可能无法刷新这些缓冲区。

很难谈论所有可能的平台。这意味着最好使用套接字来避免这种情况。

在一天结束时,应用程序应解决应用程序问题。它不应该是编译器/库测试。

答案 3 :(得分:0)

这是因为套接字(例如TCP套接字)是可读写的,就好像它们是文件或管道一样,但这只是一种抽象。网络连接的内部工作比本地文件或管道复杂得多。

首先,读取文件总是“快速”,要么是获取数据,要么是文件结束。另一方面,如果您希望来自TCP连接的500个字节并且它发送499(并且连接未关闭),您可能会永远等待。写入是一回事:它将在TCP输出缓冲区后阻塞。

即使是最基本的程序也需要处理超时,断开连接,并且所有这些事情都与FILE自己的缓冲I / O交互,甚至连教科书示例都不能正常工作。