2014-07-02 44 views
0

我有一個epoll服務器,有時會打開傳出連接,使用其主機名錶示。由於傳入連接流量的速度很高,我不想阻止像getaddrinfo()gethostbyname()之類的地方。當然,我可以實現一個緩存加一個新的線程,在那裏執行主機名解析。是否有一種單線程非阻塞方式來將主機名解析爲IP?C++異步主機名解析

+0

單線程和非阻塞是(幾乎)排除對方。如果您沒有輔助線程來處理您的工作,您期望在等待數據時不會阻止該工作? –

+0

@Puciek:我認爲你排除錯了,請參閱'epoll' – pavelkolodin

+0

我幾乎這麼說,但這不是日常編程的可行解決方案。 IO等待的最簡單方法是將你的應用程序線程化,如果你不想這麼做的話 - 使它異步,這對於重新設計來說是一件非常痛苦的事情,但是,嘿,你不想要簡單的方法! –

回答

1

爲此目的有多種庫,例如, libevent包含一個解析器。

雖然我在某種意義上認同@Puciek,但是在單線程中這樣做會給可疑的好處帶來相當大的複雜性。使用專用解析線程並通過管道與其通信可能是最佳解決方案。

既然你提到了epoll我想你正在使用Linux。它有一個getaddrinfo_a函數,如果我理解正確的話,爲你做的一部分。它克隆一個線程並在那裏運行getaddrinfo。我從來沒有使用它,所以無法幫助。

+0

'libevent'如何實現異步名稱解析? – pavelkolodin

+0

這是一個名爲'evdns'的獨立模塊。注意:我還沒有真正使用過那個。 –