什么是SOCKET类型?

5

我看到它似乎是一个无符号整数指针的别名,对吗?它就像内存中的指针一样吗?它实际上指向什么?它指向一个结构体吗?如果是,那么该结构体是如何定义的?它只是一个被套接字函数使用的数字,并不映射到内存地址吗?

3个回答

10

在Win32中,SOCKET数据类型与HANDLE相同,它是一个整数,用于引用某种内核数据结构。这个内核数据结构是“不透明”的,这意味着应用程序不需要(实际上也不能)看到结构的内部。所有对Win32 SOCKET的访问都通过Winsock API函数进行。

请注意,在Win16中,SOCKET不是同一件事情,因为没有Win16的HANDLE类型。然而,为了源代码兼容性,Win32保留了相同的类型名称。


“Handle” 定义了它的含义,尽管它不是常规的 Win32 HANDLE。大多数 HANDLE 是指向它们所代表对象的指针,但 SOCKET 不是这样的。它更像是一个 ID 而不是 HANDLE。 - Havenard
2
所有的Win32句柄都是内核对象表中的整数索引;它们并不是指针。 - Greg Hewgill

2

来自维基百科-

通常,文件描述符是一个索引,指向一个内核驻留的数据结构中所有打开文件的详细信息。在POSIX中,此数据结构称为文件描述符表,每个进程都有自己的文件描述符表。用户应用程序通过系统调用将抽象键传递给内核,内核将代表应用程序访问文件,基于该键。应用程序本身无法直接读取或写入文件描述符表。 链接


2
你可以查看Linux源代码中的socket.h文件。虽然在套接字(socket)的情况下,socket.h中并没有描述它的类型,但是一个socket就像C语言中open函数返回的文件描述符一样,也是一个文件描述符。
至于什么是文件描述符:从高层次来说,它通常只是一个整数(int),操作系统将其转换为与文件对象或网络通信的套接字对象或进程间通信的管道进行通信的方式...

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