2011-01-20 41 views
0

我試圖打開已經打開的UDP端口,並且ACE_SOCK_Dgram :: open()失敗。 正如所料,strace顯示bind()失敗,errno設置爲EADDRINUSE。ACE_SOCK_Dgram :: open()和errno

要查看發生了什麼錯誤,我使用了ACE_OS :: last_error(),但沒有更新。

我想給用戶說明該端口已經在使用,而不是一些一般性的錯誤。

獎金問題 - 何時可以使用ACE_OS :: last_error()?

TNX

+0

@baris_a你有答案嗎?我會接受它:) – dimba 2011-01-21 11:04:34

回答

1

我發現了這個問題。我用ACE_OS :: last_error()來宏(是的,宏是壞的),它擴展到幾個鏈接。其中一行執行了系統調用,因此errno的值改變了

0

你有沒有嘗試過自己檢查errno調用打開後?在我看來,如果errno == EADDRINUSE你可以從那裏處理它,而不需要ACE的幫助。

1

如果您提供了更多詳細信息,它將有所幫助。你在哪個平臺上運行你的應用程序?你正在使用什麼版本的ACE庫?它是一個1-1024範圍內的UDP端口嗎?你使用廣播UDP套接字嗎?

讓我們假設你正在檢查「errno」而不是GetLastError(),你正在UNIX上運行,如Linux。查看OS_S_errno.inl,您可以找到描述不同操作系統之間行爲差異的註釋。

你不問爲什麼你首先獲得UDP套接字的EADDRINUSE。你使用SO_REUSEADDR選項嗎?如果你這樣做,你應該知道只有最後一個綁定到套接字的進程會被通知,並且行爲可能會在操作系統之間有所不同。

是否有可能在bind()之後發出另一個系統函數調用?在這種情況下,bind()返回的錯誤可能會通過後面的系統調用重置。正如你可以從last_error()的實現中看到的那樣,它只是在窗口上設置「errno = :: GetLastError()」,並在UNIX上直接返回errno。