2009-08-22 47 views
2

我可以看到它看起來像一個無符號int指針的別名,對嗎?它就像內存中的指針嗎?它將實際指向什麼?它指向一個結構?如果是,那麼這個結構是如何定義的?它只是一個由套接字函數使用的數字,並且不映射到內存地址?什麼是SOCKET類型?

回答

7

在Win32中,一個SOCKET數據類型是相同的一個HANDLE,這是用來指某種類型的內核數據結構的整數。這個內核數據結構是「不透明」的,這意味着應用程序不需要(並且事實上不能)看到結構的內部。所有對Win32 SOCKET的訪問均通過Winsock API函數完成。

請注意,在Win16中,SOCKET不是一回事,因爲沒有Win16 HANDLE類型。但是,Win32爲源代碼兼容性保留了相同的類型名稱。

+0

「Handle」定義了它是什麼,儘管這不是常規的Win32句柄。大多數HANDLE是指向它們所代表的對象的指針,而SOCKET則不是。它更像是一個ID,然後是一個HANDLE。 – Havenard 2009-08-22 02:51:05

+0

所有Win32 HANDLE都是整數索引到內核對象表中;他們不是像這樣的指針。 – 2009-08-22 05:09:02

2

從wikipedia-

一般來說,文件描述符是在 內核駐留數據結構 包含所有打開的 文件的詳細信息條目的 指數。在POSIX中這個數據結構是 叫做文件描述符表,而 每個進程都有自己的文件 描述符表。用戶應用程序 通過系統調用將抽象密鑰傳遞給內核 ,內核 將根據密鑰代表 應用程序訪問文件。 應用程序本身無法讀取或 直接寫入文件描述符表 。 link

2

例如,您可以查看the Linux source for socket.h。雖然套接字(其類型實際上並未在socket.h中描述)的情況下,套接字是一個文件描述符,與C中的open的返回值不同(它不用於日常編程)。

至於什麼是file descriptor:在一個非常高的層次上,它通常只是一個int,操作系統轉換爲與文件對象或網絡通信的套接字對象進行通信的方式,或者用於在進程...