2010-11-10 95 views
2

在將一些工作單元測試從Linux移植到Windows時,我遇到了一個奇怪的問題。看來,在我的測試中去關閉服務器插座,關機()返回-1,但WSAGetLastError()返回0(和getsockopt(與SO_ERROR)返回0,並且GetLastError()返回0)......所以,關機( )告訴我有一個錯誤,但所有正常的調用,看看有什麼問題是返回「沒問題!」...有沒有人見過這個?Win32 :: shutdown()返回-1,但WSAGetLastError()返回0?

調用關機的代碼看起來是這樣的:

int ret = ::shutdown(_sok, mode); 
if(ret < 0) 
    X_THROW((XSDK::ModuleId, XSDK::F_OS_ERROR, "Unable to shutdown socket.")); 

當我捕捉到了異常,我呼籲所有那些GetLastError函數()函數...是否拋出重置最後一個錯誤?

+1

你能發佈代碼嗎?只是想知道你有一個像'if(error = SOCKET_ERROR)'這樣的檢查...' – 2010-11-10 17:38:07

+0

'X_THROW'是做什麼的?如果它進行一些其他系統調用,則可能會重置錯誤代碼。 – casablanca 2010-11-10 17:45:10

+0

看着X_THROW(),我沒有看到它做了任何可以清除錯誤的東西......它只是通過我們的記錄器(在Windows上,將消息寫入文件)記錄錯誤,然後創建一個異常對象,然後拋出它...我們的異常對象從std :: exception繼承.. – dicroce 2010-11-10 17:54:02

回答

2

答案結束了,幾乎所有的系統調用可以清除的Win​​32的「LastError()」的錯誤...在我的情況下,拋出異常的意思格式和記錄消息,造成錯誤是明確的...儘管我在catch(...)中立即調用了WSAGetLastError(),但已經太晚了......

相關問題