我试着用几个例子来解释我的意思:
这没什么大不了的,但还是让我头疼。
发布于 2010-07-15 13:32:20
密闭只能在Windows上使用,我不知道为什么他们没有遵循WSA的惯例。如果它真的困扰你,尽管你可以自己做包装,调用密闭。
正如在WSASocket中提到的,应该调用密闭盒。
发布于 2010-07-16 16:23:46
要理解这一点,你必须意识到Winsock是20世纪90年代早期创建的,当时Windows 3.x恐龙在地球上漫游。
Windows套接字("Winsock") API反映了大部分BSD套接字API:其中两者都提供了给定的函数,两者都做同样的事情。因此,在这两个API中,socket()都是相同的调用。在不同的地方有微小的差别,但没有什么比其他基于BSD套接字的系统,如Linux和OS在网络编程方面的差异更大。
除了实现这个公共基础API之外,Winsock API还为BSD套接字提供了许多扩展。许多函数的名称与原始函数相似,但其他所有内容都使用了WSA前缀和camel大小写。这些都是原始函数的纯扩展版本,而不是替换它们。根据您是否需要扩展的功能,以及您的程序是否必须可移植到只提供BSD套接字API的系统,您可以选择使用哪一种。例如,WSASocket()使用与socket()相同的参数加上与其他Winsock扩展相关的三个附加参数。如果您不需要扩展,那么调用socket()并没有什么真正的损失,而且您还获得了可移植性的好处。
除了这些简单的扩展之外,还有一些Winsock扩展没有直接的BSD等效项,例如WSAAsyncSelect()。这通常与Windows程序编写方式的不同有关,与Unixy系统的程序不同有关。在这种特殊情况下,WSAAsyncSelect()的存在是为了便于编写使用套接字的单线程GUI程序,而没有网络I/O阻塞GUI,反之亦然。这在今天是有用的,但对于Winsock在Windows3.1天中的成功绝对重要,Windows 3.1天没有线程或其他有用的多处理和IPC机制。
这只剩下几个像closesocket()和ioctlsocket()这样的怪胎。
closesocket()与POSIX/Unix下的close(2)相同,只不过它只使用套接字,而不是文件句柄。这是改变名字的原因之一,但真正的原因来自我上面提到的上世纪90年代早期的历史问题。在那些日子里,一些Windows编译器--比现在更多的是更多 可用 然后 --包含了POSIX API的等价物,以方便将代码从其他平台移植到Windows。这些特性是非常有限的,不包括套接字支持,但尽管如此,close()函数名在当时被认为是“采用”的。这已经不是真的了,但是Winsock是它历史的产物,现在不能改变。
ioctlsocket()与ioctl()的故事相似。一个很大的区别是,与ioctl()在Unix系统上所能做的相比,ioctl()在Windows上的应用受到很大的限制。它的存在只是为了向Windows提供一些最初的Winsock创建者认为在BSD套接字API中有用的网络相关设施。多年来,您可以在Unixy系统上使用套接字和ioctl() (而不是使用ioctlsocket() )所做的许多事情都是通过其他API添加到Windows中的,其中只有一个是WSAIoctl()。
我为Winsock程序员的常见问题 (我维护的)写了一篇关于“Winsock程序员的常见问题”的文章,详细介绍了这一切。另一篇相关文章是“BSD套接字兼容性”。
发布于 2015-08-23 15:17:16
这写在MSDN文档中:
在两种情况下,有必要重命名伯克利套接字中使用的函数,以避免与其他函数发生冲突。
关闭和关闭
套接字由伯克利套接字中的标准文件描述符表示,因此可以使用 close 函数来关闭套接字和常规文件。虽然Windows套接字中没有任何东西阻止实现使用常规文件句柄来标识套接字,但也不需要它。在Windows上,必须使用密闭例程关闭套接字。在Windows上,使用关闭函数关闭套接字是不正确的,此规范未定义此功能的效果。
Ioctl和Ioctlsocket/WSAIoctl
各种C语言运行时系统将IOCTL用于与Windows套接字无关的目的.因此,定义了套筒函数和WSAIoctl函数来处理IOCTL和fcntl在伯克利软件分发版中执行的套接字函数。
https://stackoverflow.com/questions/3255899
复制相似问题