还有哪些套接字API可用?这些Socket API之间有什么区别?

时间:2010-01-15 10:04:08

标签: sockets network-programming posix winsock

每个人都将其称为C中的套接字编程或网络编程,我们通过使用sys/socket.h&来开始使用它。 netinet/in.h。我们认为这是100%真实。但是当我看到这本书时,脑子里浮现出一些问题

使用TCP / IP进行网络互连第三卷:客户端 - 服务器编程和应用,提供4种不同版本

  1. Linux / POSIX套接字
  2. AT& T TLI(传输层接口)套接字
  3. BSD(伯克利)插座
  4. Window Sockets
  5. 我很困惑。这清楚地表明Socket API没有标准。

    我也很惊讶地看到sys/socket.h& netinet/in.hhttp://en.wikipedia.org/wiki/Berkeley_sockets中POSIX C库的一部分。我现在更困惑了。

    1. 为什么没有这方面的标准?
    2. 还有哪些套接字API可用?
    3. 这些Socket API之间有什么区别?
    4. 当人们说“C语言编程”/“套接字编程”时他们究竟指的是什么?
    5. 有关更多信息的链接?

4 个答案:

答案 0 :(得分:5)

  

为什么没有这方面的标准?

事实上的标准是BSD套接字,Linux,POSIX和Windows套接字API基于此套接字。

  

还有哪些套接字API可用?

还没有广泛使用的东西。在BSD套接字及其衍生产品占领世界之前,有很多。剩下的大多数都可能存在于嵌入式领域,即使是那些随着主流操作系统继续吞噬越来越多嵌入式市场的东西也会消失。

到90年代中期,这场战斗几乎已经结束了。赢得了BSD插座。

  

这些Socket API之间有什么区别?

BSD,Linux和POSIX变体之间存在细微差别,没有比Unixy操作系统之间的任何其他差异更严重。

他们拥有本书Linux / POSIX版本的原因可能与营销有关,而不是任何技术问题。它回答了一个问题,出版商可能会看到很多,“为什么我需要一本BSD书,我正在运行Linux,而不是BSD!”或者,现在更常见的是:“什么是BSD?”

从10,000英尺的角度来看,Winsock与BSD套接字有很大不同,但由于它是BSD套接字的一个相当严格的超集,你仍然可以移动你的知识。大多数差异都是BSD套接字的纯扩展,主要与Windows内核体系结构的差异以及Windows程序的构建方式有关。例如,第一个非常大的扩展是异步套接字,这使得在单线程Windows GUI程序中使用套接字比使用纯BSD套接字更容易。后来的扩展支持NT派生内核中可用的特殊功能,这些内核在Unixy系统中没有简单的模拟,比如事件对象和重叠的I / O.

对于它的价值,在某些Unixy系统中也存在普通旧BSD套接字的扩展,如Solaris和其他系统中的aio_*()内容。

如果您的程序必须与许多系统源兼容,您可以忽略这些差异并编程到所有这些系统共享的公共基础,或者构建某种转换层,使您可以透明地使用平台功能。例如,Apache使用后者,利用每个平台上最快的网络功能,而核心Web服务器代码并不关心网络的完成方式。许多其他程序选择便携式路径,因为它们不是性能关键,因此节省程序员时间更重要。

  

当人们说“C语言编程”/“套接字编程”时他们究竟指的是什么?

BSD套接字或某些变体。

  

有关更多信息的链接?

The Winsock Programmer's FAQ。具体来说,您可能需要查看其resources部分和常见问题解答文章BSD Sockets Compatibility

(免责声明:我是FAQ的维护者。)

答案 1 :(得分:2)

Linux,BSD和Windows套接字API(至少;我不知道AT& T TLI API)彼此非常相似。例如,Windows API最初基于BSD API。

答案 2 :(得分:2)

  

为什么没有这方面的标准?

有。你命名了几个。任何人都可以发布一个“标准”,没有必要只是一个,也没有一些控制权力赋予“一个真正的方式”的权力。在网络方面,真正的标准是网络协议本身。每个人都必须与他们互动,否则什么都不能合作。任何给定平台如何实现API以实现该目标都会有所不同。

  

这些Socket API之间有什么区别?

Linux / POSIX / BSD都很相似。 Windows有点不同,但由于它仍然必须支持底层协议,因此功能最终几乎相同。老实说,我不确定谁再使用AT& T TLI,如果有的话。

  

还有哪些套接字API可用?

可能有很多,但这是一个谁再使用它们的问题。 IBM曾经有过一堆,当天大多数其他主要制造商也是如此。但是我觉得这些因为大多数人都使用TCP而大部分时间已退役到历史垃圾箱。

  

当人们说“C语言编程”/“套接字编程”时他们究竟指的是什么?

没什么精确的。从技术上讲,C语言对网络编程一无所知。然而,许多供应商(例如Unix,Linux,Windows等)提供C库来执行网络操作,因此您提到了许多API。

答案 3 :(得分:1)

TLI接口实际上与OSI对齐。 Novell也曾一度发货。它已经过时了。 Linux和Winsock API基于BSD API,在Linux的情况下非常接近,在Winsock的情况下则更少。两种情况下的实施差异都很小。