2011-01-13 94 views
7

我正在嘗試在Windows中運行Linux服務器。Windows中的socket和HANDLE有什麼區別?

Linux中的套接字和文件描述符都是一樣的。 某些系統API可用於套接字和文件描述符。

但是,我通過WIN API處理Winsock和HANDLE(文件描述符)的套接字。

所以我需要知道一個整數是一個套接字或一個句柄。

現在這裏的問題是:

將從插座() 和open()的返回值是在Windows中一樣嗎?

如果它們總是不同,我可以編寫自己的socket()和open()來包裝系統的一個。 並記錄來自系統api的返回值,無論該整數是套接字還是HANDLE。

如果他們會一樣,我不知道處理它。

+0

'同樣'在什麼意義上? – EJP 2011-01-13 05:17:11

+0

價值相同。 – Celebi 2011-01-13 05:26:50

回答

10

套接字句柄是Win32(NT內核)句柄,因此您可以在它們上使用ReadFile或WriteFile。還有與Winsock維護的句柄相關聯的用戶模式狀態,這就是爲什麼您需要使用closesocket()而不是CloseHandle()。

open()返回與Win32句柄不同的CRT文件描述符。您可以使用_open_osfhandle()創建CRT文件描述符。但是這不是推薦用於套接字,因爲你不能以一種乾淨的方式關閉文件。你要麼使用會泄漏Winsock用戶模式狀態的close(),要麼使用會泄漏CRT描述符的closesocket()。

-1

在Windows中socket() 和open()的返回值是否相同?

Windows中的套接字句柄由WINSOCK子系統分配,它根本不屬於文件系統的一部分。

+0

這在以前是真實的,但從Windows NT套接字句柄現在是完整的內核對象,並不完全實現爲用戶模式DLL,儘管今天仍然存在一些用戶模式狀態。 – 2015-02-16 18:52:00