为什么POSIX没有定义中间层套接字API?

时间:2015-02-08 18:09:58

标签: c sockets posix standard-library

我再次关注套接字编程。我得到了详细信息(好吧,我可以从各种网站复制它们,我知道代码是启用Unix低级程序),但我没有得到POSIX逻辑并在其API中思考。

  • 为什么他们没有在这些低级套接字功能上构建稍微更高级别的接口?
    据推测,这样的代码可以将经常重复(并且容易出错)的代码分解为更方便的FILE类接口。当较低级别的使用在>中相同时,保理似乎更方便。 90%的用途。几乎所有套接字都使用我在应用程序中看到的打开套接字,读取和写入它并关闭套接字。另外,为什么需要绑定,当这真的是公开调用总是这样做的时候?

  • 当前界面甚至涵盖了什么情况,这些情况很难被一个看起来像FILE界面的界面轻易覆盖?
    一种解释是,有些用户不会绑定到套接字,例如,fgets / fputs / fprintf / fscanf之类的功能需要额外的东西(超时)?

必须有一个我失踪的原因。否则,20年后,已经有一个或多个标准库可以促进这一点并且可以广泛使用。我无法在谷歌上找到一个模仿所有FILE例程的人。

2 个答案:

答案 0 :(得分:3)

这一点非常简单:

因为套接字不是文件。

让我详细说明:recv / send的工作原理与read / write非常相似,如果您限制自己从一开始就线性读取文件,并附加到它的结束。

但是,你会说,send不允许我写任意长度的数据!如果我尝试将更多数据发送到协议的数据包缓冲区中,则会产生错误!

这实际上是套接字之美:你实际上是将数据发送出去了。你不能保留它;它一旦被发送就消失了,一旦收到它就不存储。套接字为您提供了一整套不同的功能(例如,发送比网络的最大数据包大小更小的数据包),另一方面,您需要自己进行一些控制。

编辑:send不会“抛出”错误。 “投掷”不是处理错误的C / Posix方式。相反,它将返回错误(来自man 2 send):

  

如果消息太长而无法通过底层协议原子传递,则返回错误EMSGSIZE,并且不传输消息。

答案 1 :(得分:2)

C编程语言很可能总是轻量级的。您需要了解C基本上可以在任何地方运行,有些事情需要经过长时间的研究才能实现标准化 此外,我已经看到添加了新的库,因为C ++继续并使它们成为标准,因此它是一种C共享。

请注意您可以"绑定"通过fdopen(3)到文件的套接字,并将其视为二进制文件。当然,你仍然需要绑定它,让它听,接受以及你可以在一个不能为文件工作的套接字上做的所有动作。
实际上,尽管接口类似,但套接字仅部分用作UNIX文件:甚至还有errno值,ENOTSOCK表示非套接字文件描述符上的套接字特定操作。

此外,请考虑缓冲。你确实希望文件写入以大块完成,因此需要更大的缓冲,以使其更快;这不适用于套接字,因为您需要立即发送数据,即取消延迟。 考虑这个例子:

char one = '1', two = '2', three = '3';
   fwrite(&one, 1, 1, socket_file);
   fprintf(socket_file, "%c\n", two);
   send(fd, &three, 1, 0);

其中fd是连接的socket(AF_INET, SOCK_STREAM, 0)socket_file = fdopen(fd, "w+")。接收方将读取312,因为除了FILE层上的流程终止之外没有刷新,这与send立即发送three不同。