套接字编程

4
这是一个比较通用的快速问题。但在C#,Python,C,C ++等编程语言中,所有基本的套接字 "Sockets" 网络编程本质上都是相同的吗?像它们是否都使用 Berkley Sockets(我认为这就是它们的称呼),或者每种语言都有自己的方式来处理套接字?
谢谢。
4个回答

4
套接字是与平台相关的,而不是与语言相关的。因此,Linux仅使用BSD套接字,Windows提供BSD套接字(几乎全部使用)和一种名为WSA的M$套接字风格,其他平台则不确定。这归结于在底层内核级别找到的内容——通常通过共享对象/动态链接库来使它们可访问于内核/用户空间,并且“本地”支持C/C++语言。所有其他语言都依赖于针对这些由操作系统原生提供给C/C++的SO/DLL文件的语言特定绑定。

希望对你有所帮助


我从未听说过WPA,你是指WSA吗?如果我没记错的话,它们并不是真正不同的套接字 - 你可以连接到一个套接字,如果它是WSA或BSD套接字,你不会看到任何区别。WSA API只是方便的帮助程序,例如在套接字事件发生时获取Windows消息。 - Niki
抱歉。WSA,是的。Windows消息和其他一些差异-请检查http://msdn.microsoft.com/en-us/library/ms742212%28v=vs.85%29.aspx中的dwFlags参数。您将无法获取http://msdn.microsoft.com/en-us/library/ms740506%28v=vs.85%29.aspx的那些标志 - kellogs
好的,那么......大家谈论的"raw" socket API,不就是Berkley的吗?顺便说一下,我主要关注Unix......他们的"Raw socket" API叫什么呢?无论如何,我假设它们的语法都相似,并且没有太多变化对吧?尽管看起来BSD已经被POSIX取代成为Unix了,是这样对吗? - user475353
1
嗯...我所知道的关于POSIX的只有libpthread...在查看了http://en.wikipedia.org/wiki/POSIX#POSIX.1之后,对我来说网络套接字似乎与其无关。另外一件事,让我们将本地套接字API称为“本地套接字API”,而不是“原始套接字API”(其中原始套接字具有神圣的意义(不同)-它们与IP套接字相关,但没有任何来自第4层OSI堆栈的内容)。据我所知,Unix就像世界上其他地方一样使用BSD套接字。 - kellogs
哦,好的,我可能看错了东西,谢谢。 - user475353

1

在C、C++、Java、Ruby中,套接字基本上都是相同的。在高级语言中,它们稍微容易些(因为内置类处理了样板),如果你能在C中编写套接字代码,那么只要有翻译参考,你就可以在任何地方做到。

@Kellogs 提出了一个很好的观点,Windows有他们自己的Socket API,在我的经验中(通常)在Windows上比提供的Posix实现表现优异。这些API非常相似。我会将其比作OpenGL和DirectX之间的类比。如果你真正掌握了其中一个,那么你就可以通过参考来理解另一个。


0
现在我们不区分语言、可以从语言访问的类库和底层操作系统。以下是我的解释:
C、C++、C#、Java - 只是语言,没有特定的网络编程支持。
Java 类库、.Net Framework、C++ 标准库 - 在这些中,我认为 C# 和 Java 提供了一些网络编程类。C++ 标准库没有提供任何网络编程类(只有文件、标准输入和字符串的 iostreams)。但是 BOOST 库为 C++ 提供了网络编程类。我不知道其他库。
操作系统 - 操作系统提供了一个基本的 API(主要是 C),被上述类库所利用。在 Windows 中,它是 winsock API(WSA),在 Unix 中,它是 BSD socket API。我认为 Windows 也在某种程度上支持 BSD API,因此学习曲线较小。但正如 @EnabrenTane 所说,情况比这更复杂。

0

同意kellogs的观点。Windows和大多数主流符合POSIX标准的操作系统都支持基本的BSD套接字API。除了Berkeley套接字之外,每个平台还提供了额外的专有API以提高性能和可扩展性。这些扩展API不仅严格限制于套接字 - 它们可以在任何I/O操作上工作(即磁盘文件、命名管道等)。例如,Linux除了传统的select()和poll()外,还有自己的epoll机制,BSD有kqueue,Windows有WSAevent*,WSAaAsync*和I/O完成端口API。

这些差异在较低级别的语言(如C、C++或Pascal)中最为明显。

C#、Java、Python、Ruby等编程语言相对于C语言而言,属于“高级”语言,它们提供了强大的技术来隔离您与底层API的直接交互。您可以使用每个平台提供的广泛运行时类库,而不是直接使用裸奔的Socket API。例如,在Python中编写TCP/IP服务器,您可以简单地使用SocketServer类。同样,在C#中,您可以使用WebClient从网络上下载文件。在C++中,您可以使用Boost库。当然,您也可以在应用程序中直接使用原始socket API。


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