2014-02-12 35 views
2

我需要快速測試大約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()謀殺它。

有什麼比這更好的?

回答

1

我不確定這是否適合您的模型,但也許您可以解析一次主機名的IP地址,作爲冷啓動類型的東西,然後緩存它們。

這樣就避免了必須使用WSAAsyncGetHostByName這是瓶頸,而只需要測試HTTP通信。

現在,假設您有理由懷疑某個主機自上次解析它之後已更改其IP地址(例如,目標無法訪問或連接被拒絕),則可以再次爲該主機運行查詢。

+0

是的,這將有助於我相信。順便說一句,Windows系統本身不做兌現嗎? –

+1

它會在您運行「DNS客戶端」服務時執行。 –