我正在使用POSIX C++程序的Windows端口。在Win64下將SOCKET強制轉換爲int是否安全?
問題是像accept()或bind()這樣的標準POSIX函數期望'int'作爲第一個參數,而其WinSock對應物使用'SOCKET'。
當32位編譯一切都很好,因爲兩者都是32位的,但Win64的SOCKET下是64位和INT保持32位,併產生大量的編譯器警告的是這樣的:
warning C4244: '=' : conversion from 'SOCKET' to 'int', possible loss of data
我試着通過使用typedef來解決問題:
#ifdef _WIN32
typedef SOCKET sock_t;
#else
typedef int sock_t;
#endif
並在適當的位置用sock_t替換int。
這很好,直到我到達調用OpenSSL API的代碼的一部分。
事實證明,即使在Win64上,OpenSSL也使用套接字的套接字。這似乎真的很奇怪,於是我開始尋找答案,但我發現的唯一的事情是舊的文章,其refered的評論e_os.h OpenSSL的開發郵件列表:
/*
* Even though sizeof(SOCKET) is 8, it's safe to cast it to int, because
* the value constitutes an index in per-process table of limited size
* and not a real pointer.
*/
所以我的問題是:
將SOCKET強制轉換爲int是否真的很安全?
我希望看到一些證明SOCKET的值不能大於2^32的文檔。
在此先感謝!
Ryck
+1:我有同樣的問題**會員** ... – paercebal 2010-05-26 13:22:28