我需要快速測試大約100個Web服務器的連接列表。快速意味着大約5秒鐘。如果服務器無法訪問約2-3秒,應該跳過。如果沒有互聯網連接 - 測試應該很快失敗 - 2-3秒。它應該在XP(SP2)以上運行。多個名稱的併發和可中斷DNS名稱解析似乎是不可能的
我決定在單獨的線程中爲每個服務器運行一個測試過程。
同步測試程序執行以下操作:
gethostbyname()
或getaddrinfo()
(嘗試都)- 創建一個套接字
connect()
- 發送HTTP請求
- 讀HTTP性反應(只是半千字節)
這是沒有好處:
- 在緩慢的服務器的connect(的情況下)與沒有超時阻斷。
- 如果沒有互聯網連接 - gethostbyname()和getaddrinfo()阻塞很長一段時間:17+秒。
異步測試程序:
- 的異步消息
WSAAsyncGetHostByName()
創建窗口 - 接受連接,隨時可以發送 - 當分辨率爲完整WSAAsyncSelect()
接收消息和準備閱讀消息SetTimeout()
接收超時消息並彈出- 運行的窗口
消息循環這其中也白搭,因爲WSAAsyncGetHostByName()
「的目的不是要提供幾個名字的平行決議」(MSDN)。即使從多個線程調用,它也可以進行順序解析。這使得線程按順序運行,從而破壞了它們的目的。
因此,我的問題:要麼阻止無法中斷的調用,要麼阻止不能被並置的異步調用。
在我看來,唯一的選擇是在單獨的線程中執行阻塞調用,並且如果線程沒有足夠快地完成 - 用TerminateThread()
謀殺它。
有什麼比這更好的?
是的,這將有助於我相信。順便說一句,Windows系統本身不做兌現嗎? –
它會在您運行「DNS客戶端」服務時執行。 –