ネットワーク接続が開いていて、c# で特定の IP アドレスに接続できることを確認するにはどうすればよいですか? 私はVB.Netで例を見てきましたが、それらはすべて「My」構造を使用しています。ありがとうございました。
7 に答える
ネットワークが稼働しているかどうかを確認するだけの場合は、次を使用します。
bool networkUp
= System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
特定のインターフェイスのステータス (またはその他の情報) を確認するには、次を使用します。
NetworkInterface[] networkCards
= System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();
リモートコンピューターのステータスを確認するには、そのコンピューターに接続する必要があります(他の回答を参照)
第一案(IP接続)
次のようなものを使用して、IP アドレスへの接続を試みることができます。
IPEndPoint ipep = new IPEndPoint(Ipaddress.Parse("IP TO CHECK"), YOUR_PORT_INTEGER);
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server.Connect(ipep);
「Chat」プログラムのチェックコードをお勧めします。これらのプログラムは、多くの IP 接続を操作し、IP が使用可能かどうかを確認する方法を教えてくれます。
2 番目の提案 (Ping)
ping を試すことができます。ここに良いチュートリアルがあります。次のことだけを行う必要があります。
Ping netMon = new Ping();
PingResponse response = netMon.PingHost(hostname, 4);
if (response != null)
{
ProcessResponse(response);
}
HTTP ステータス コードに関心がある場合は、次のようにすると問題なく動作します。
using System;
using System.Net;
class Program {
static void Main () {
HttpWebRequest req = WebRequest.Create(
"http://www.oberon.ch/") as HttpWebRequest;
HttpWebResponse rsp;
try {
rsp = req.GetResponse() as HttpWebResponse;
} catch (WebException e) {
if (e.Response is HttpWebResponse) {
rsp = e.Response as HttpWebResponse;
} else {
rsp = null;
}
}
if (rsp != null) {
Console.WriteLine(rsp.StatusCode);
}
}
}
を使用してネットワークの状態を確認できます
if(System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
{
//Do your stuffs when network available
}
else
{
//Do stuffs when network not available
}
特定の IP への接続を試み、拒否とタイムアウトを処理します。
System.Net.Sockets 名前空間の TcpClient クラスを見てください。
私の考えは、別のスレッドで監視を行うための静的クラス/モジュールを用意することでした。簡単な DNS 解決により、ネットワークが稼働しているかどうかを確認できます。ping IMO よりも優れています。
Imports System.Net
Public Module Network_Monitor
Private InsideWorkNet As Boolean = vbFalse
Private Online_Status As Boolean = vbFalse
Private CurrentWorkIPAddress As New IPHostEntry
Private WithEvents Timer_Online_Check As New Timers.Timer With {.Interval = 5000, .Enabled = True, .AutoReset = True}
Public ReadOnly Property GetOnlineStatus() As String
Get
Return Online_Status
End Get
End Property
Public Sub Initialize()
Set_Online_Status()
Timer_Online_Check.Start()
End Sub
Public Sub Set_Online_Status()
If My.Computer.Network.IsAvailable Then
Try
Dim DNSTest As IPHostEntry = Dns.GetHostEntry("google.com")
If DNSTest.AddressList.Length > 0 Then
Online_Status = True
Else : Online_Status = False
End If
Catch ex As System.Net.Sockets.SocketException
Online_Status = False
End Try
End If
End Sub
Private Sub Timer_Online_Check_Elaspsed(ByVal sender As Object, ByVal e As Timers.ElapsedEventArgs) Handles Timer_Online_Check.Elapsed
Set_Online_Status()
End Sub
Public Sub Detect_Work_Network()
If Online_Status = True Then
Dim WorkIP As IPHostEntry = New IPHostEntry()
Try
WorkIP = Dns.GetHostEntry("serverA.myworkdomain.local")
If WorkIP.AddressList.Length > 0 Then
InsideWorkNet = True
CurrentWorkIPAddress = WorkIP
'MessageBox.Show(WorkIP.HostName.ToString(), "WorkIP", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
Catch ex As Sockets.SocketException
Try
WorkIP = Dns.GetHostEntry("serverA.myworkdomain.com")
If WorkIP.AddressList.Length > 0 Then
InsideWorkNet = False
CurrentWorkIPAddress = WorkIP
' MessageBox.Show(WorkIP.HostName.ToString(), "WorkIP", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
Catch ey As Sockets.SocketException
End Try
End Try
End If
End Sub
Public Function GetWorkServerName() As String
If InsideWorkNet = True Then
Return "serverA.myworkdomain.local"
Else : Return "serverA.myworkdomain.com"
End If
End Function
End Module
また、自分が職場のネットワークの内部にいるか外部にいるかを判断する必要もありました。アプリが通信するためのファイアウォールの両側にある異なるサーバー。