我需要輪詢運行某些專有軟件的服務器以確定此服務是否正在運行。使用wireshark,我已經能夠縮小它使用的TCP端口,但看起來流量是加密的。確定服務器是否在給定端口上偵聽
在我的情況下,如果服務器正在接受連接(即telnet serverName 1234),那麼服務啓動並且一切正常。換句話說,我不需要做任何實際的數據交換,只需打開一個連接然後安全地關閉它。
我想知道如何用C#和套接字來模擬這個。我的網絡編程基本上以WebClient結束,所以這裏的任何幫助都非常感謝。
我需要輪詢運行某些專有軟件的服務器以確定此服務是否正在運行。使用wireshark,我已經能夠縮小它使用的TCP端口,但看起來流量是加密的。確定服務器是否在給定端口上偵聽
在我的情況下,如果服務器正在接受連接(即telnet serverName 1234),那麼服務啓動並且一切正常。換句話說,我不需要做任何實際的數據交換,只需打開一個連接然後安全地關閉它。
我想知道如何用C#和套接字來模擬這個。我的網絡編程基本上以WebClient結束,所以這裏的任何幫助都非常感謝。
該過程其實很簡單。
using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
try
{
socket.Connect(host, port);
}
catch (SocketException ex)
{
if (ex.SocketErrorCode == SocketError.ConnectionRefused)
{
// ...
}
}
}
使用TcpClient類連接服務器。
只要使用TcpClient
嘗試連接到服務器,如果連接失敗,TcpClient.Connect將引發異常。
bool IsListening(string server, int port)
{
using(TcpClient client = new TcpClient())
{
try
{
client.Connect(server, port);
}
catch(SocketException)
{
return false;
}
client.Close();
return true;
}
}
有沒有辦法調整連接超時?它似乎失敗了,但只有大約一分鐘後...... – Nate 2010-05-14 18:51:36
我已經使用了下面的代碼。有一個警告......在高事務環境中,客戶端的可用端口可能會耗盡,因爲這些套接字不是由操作系統以.NET代碼發佈的相同速率釋放的。
如果有人有更好的主意,請發帖。我發現服務器無法再傳出連接時會出現雪球問題。我正在尋找更好的解決方案...
public static bool IsServerUp(string server, int port, int timeout)
{
bool isUp;
try
{
using (TcpClient tcp = new TcpClient())
{
IAsyncResult ar = tcp.BeginConnect(server, port, null, null);
WaitHandle wh = ar.AsyncWaitHandle;
try
{
if (!wh.WaitOne(TimeSpan.FromMilliseconds(timeout), false))
{
tcp.EndConnect(ar);
tcp.Close();
throw new SocketException();
}
isUp = true;
tcp.EndConnect(ar);
}
finally
{
wh.Close();
}
}
}
catch (SocketException e)
{
LOGGER.Warn(string.Format("TCP connection to server {0} failed.", server), e);
isUp = false;
}
return isUp;
有沒有辦法調整連接超時?它似乎失敗了,但只有大約一分鐘後... – Nate 2010-05-14 18:51:06
@Nate我相信這是多久的過程。沒有連接超時選項。 – ChaosPandion 2010-05-14 18:57:23
我加了'if(ex.SocketErrorCode == SocketError.ConnectionRefused || ex.SocketErrorCode == SocketError.TimedOut)' – Nate 2010-05-14 19:00:26