gpt4 book ai didi

c++ - 为什么socket()、connect()、send()等有WSA挂件,closesocket()没有?

转载 作者:IT老高 更新时间:2023-10-28 23:22:44 27 4
gpt4 key购买 nike

我将尝试用几个例子来解释我的意思:

  • socket() -> WSASocket()
  • connect() -> WSAConnect()
  • send() -> WSASend()
  • sendto() -> WSASendTo()
  • recv() -> WSARecv()
  • recvfrom() -> WSARecvFrom()
  • ...
  • closesocket() -> WSA???()

这没什么大不了的,但仍然让我头疼。

最佳答案

要理解这一点,您必须意识到 Winsock 是在 1990 年代初期创建的,当时 Windows 3.x 恐龙在地球上漫游。

Windows 套接字(“Winsock”)API 反射(reflect)了大多数 BSD 套接字 API:两者都提供给定的功能,都做同样的事情。因此,socket() 是两个 API 下的相同调用。地方有细微差别,但没有比其他基于 BSD 套接字的系统(如 Linux 和 OS X)在网络编程上的差异更大的了。

除了实现通用的基础 API 之外,Winsock API 还提供了许多 BSD 套接字的扩展。许多函数的名称与原始函数相似,但带有 WSA 前缀和驼峰式大小写。这些是原始功能的纯粹扩展版本,而不是它们的替代品。您可以根据是否需要扩展功能以及您的程序是否必须可移植到仅提供 BSD 套接字 API 的系统来选择使用哪一个。例如,WSASocket() 采用与 socket() 相同的参数以及与其他 Winsock 扩展有关的三个附加参数。如果您不需要扩展,调用 socket() 并没有真正的惩罚,而且您还可以获得可移植性的好处。

除了这些简单的扩展之外,还有一些没有直接 BSD 等效的 Winsock 扩展,例如 WSAAsyncSelect()。与 Unixy 系统的程序相比,这些通常与 Windows 程序的编写方式不同有关。在这种特殊情况下,WSAAsyncSelect() 的存在使编写使用套接字的单线程 GUI 程序更容易,而网络 I/O 不会阻塞 GUI,或者反之亦然。这在今天很有用,但对于 Winsock 在 Windows 3.1 时代的成功绝对至关重要,因为它没有线程或其他有用的多处理和 IPC 机制。

只剩下一些奇怪的东西,比如 closesocket()ioctlsocket()

closesocket()close(2)在 POSIX/Unix 下,除了它只需要套接字,而不是文件句柄。这是更名的部分原因,但真正的原因来 self 在上面提到的 1990 年代早期的历史问题。在那些日子里,一些 Windows 编译器——有 more available then比今天 - 包括 POSIX API 等价物,以简化将代码从其他平台移植到 Windows。这些功能非常有限,并且不包括套接字支持,但是,close() 函数名称当时在 Windows 上被认为是“采用”的。这不再是真的,但 Winsock 是其历史的产物,现在无法改变。

ioctlsocket()ioctl() 的故事类似。一个很大的区别是 ioctlsocket() 在 Windows 上的功能与 ioctl() 在 Unix 系统上的功能相比受到很大限制。它的存在只是为了向 Windows 提供一些与网络相关的设施,最初的 Winsock 创建者认为这些设施在 BSD 套接字 API 中很有用。多年来,您可以在 Unixy 系统上使用套接字和 ioctl() 而不能使用 ioctlsocket() 的大部分功能已通过其他 API 添加到 Windows,只有一个其中是 WSAIoctl().

我为 The History of Winsock 写了一篇关于“Winsock Programmer's FAQ”的文章。 (我坚持)这会更详细地说明这一切。另一篇相关文章是“BSD Sockets Compatibility。”

关于c++ - 为什么socket()、connect()、send()等有WSA挂件,closesocket()没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3255899/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com