我目前正在爲SNMP打印機監視軟件開發自動發現功能。我需要一個幫助器方法,該方法從多個線程執行,每個線程都檢查一個範圍內的IP,以確定某個IP地址上的設備是否響應端口9100,確定它實際上是打印機,然後再發送SNMP請求。檢查IP地址和端口是否響應
我已經結束了以下方法,但是im沒有意識到這是否是正確的方法,並且如果按照約定在這種情況下正確使用Close()方法(我可以看到Dispose(), Disconnect()和Shutdown()方法也可用,所以可以使用?)。此外,我需要設置最大超時值。 5秒鐘,所以在展示結果之前線程不會停留太久。到目前爲止我的代碼:
private bool GetTCPPrinterResponse(IPAddress _ip)
{
int port = 9100;
bool isResponsive = false;
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
s.Connect(_ip, port);
isResponsive = true;
}
catch (SocketException)
{
isResponsive = false;
}
finally
{
s.Close();
}
return isResponsive;
}
方法編輯後:
private bool GetTCPPrinterResponse(IPAddress _ip)
{
int port = 9100;
bool isResponsive = false;
using (Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
s.ReceiveTimeout = 3000;
s.SendTimeout = 3000;
try
{
s.Connect(_ip, port);
isResponsive = true;
}
catch (SocketException)
{
isResponsive = false;
}
}
return isResponsive;
}
超時屬性的設置,沒有任何效果。
'Dispose'不會釋放被對象使用的內存。 Dispose用於釋放*非託管*資源。好的,在這種情況下,可能會包含一些非託管內存緩衝區,但它肯定不包含對象使用的內存。如果有必要,該內存將在未來的某個時間點由GC發佈。 –
謝謝您的貢獻。我重寫了方法,利用IDisposable的Socket類實現,並添加了超時值。但是,後者似乎沒有效果。該方法返回的結果似乎是15秒後(我懷疑這是默認的超時值)。 – MartinChristensen