2010-05-04 65 views
1

我目前正在將一些Windows Mobile C++代碼移植到標準C++。將Windows平臺C++移植到POSIX(Linux)C++ - WSAGetLastError()

所以我試圖找到windows特定功能的替代品。

我找到一個標準的C++函數可以幫助我替換WSAGetLastError()特定的函數,但運行得很少。

WSAGetLastError()返回窗口套接字發生錯誤的錯誤號。

所以我想知道是否有人知道一種方法來取代標準C++中的這個函數?

獲得不同結果的連接/分離套接字的不同錯誤號的方法就足夠了。

+2

沒有「Windows C++」這樣的東西,而且你也沒有嘗試移植到「標準C++」。您正試圖將您的程序從Windows平臺移植到POSIX平臺。與標準C++沒有太大的關係。 – jalf 2010-05-04 16:24:16

+1

您應該注意到,所有套接字函數的文檔都會告訴您它們在哪裏存儲錯誤信息。例如:http://linux.die.net/man/2/bind。無論如何,您將閱讀所有文檔,因爲套接字函數在不同的操作系統上的工作方式不同。 Linux上的套接字函數不一定與Windows上具有相同名稱的函數具有相同的行爲。密切關注角落案件。 – 2010-05-04 16:26:18

+0

感謝您的額外信息,非常感謝 – 2010-05-05 08:28:04

回答

9

沒有支持套接字的標準C++函數。但是,POSIX套接字函數應該都會設置錯誤的變量errno - 您只需要檢查它 - 它應該在errno.h中聲明。

+0

乾杯,謝謝! – 2010-05-04 15:30:10

+1

如果你使用的是非阻塞連接,那麼你還需要使用'getsockopt(socket,SOL_SOCKET,SO_ERROR,...);'來獲得'connect()'狀態。並且請注意,「errno」在成功操作時不會更改 - 因此您可能希望在每次操作之前將其專門設置爲零。 – caf 2010-05-05 01:10:56

+2

將errno設置爲零不是很好的做法。您應該只在函數調用返回值指示錯誤時才檢查它。 – 2010-05-05 08:25:31

0

我會移植到Boost.ASIO,它會抽象出網絡的差異,並可能通過使用異步調用和重疊的IO爲您提供更好的性能。當你完成你的代碼時,無處不在的提升工作。