first commit
This commit is contained in:
commit
69ce69b771
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
bin
|
||||
obj
|
36
DeviceInfo.cs
Normal file
36
DeviceInfo.cs
Normal file
@ -0,0 +1,36 @@
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
|
||||
namespace NWService
|
||||
{
|
||||
public class DeviceInfo
|
||||
{
|
||||
private IPAddress ipAddr;
|
||||
private byte[] macAddr;
|
||||
|
||||
public DeviceInfo(IPAddress iPAddress, byte[] macAddressBytes)
|
||||
{
|
||||
this.ipAddr = iPAddress;
|
||||
this.macAddr = macAddressBytes;
|
||||
}
|
||||
|
||||
public IPAddress GetIPAddress()
|
||||
{
|
||||
return ipAddr;
|
||||
}
|
||||
|
||||
public string GetMacAddress(char separate = ':')
|
||||
{
|
||||
StringBuilder sb = new StringBuilder(18);
|
||||
foreach (byte b in this.macAddr) {
|
||||
if (sb.Length > 0)
|
||||
{
|
||||
sb.Append(separate);
|
||||
}
|
||||
sb.Append(string.Format("{0:X2}", b));
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
}
|
||||
}
|
104
DicSerialize.cs
Normal file
104
DicSerialize.cs
Normal file
@ -0,0 +1,104 @@
|
||||
using System.Xml.Serialization;
|
||||
using System.Text;
|
||||
using System.Text.Encodings;
|
||||
|
||||
namespace NWService
|
||||
{
|
||||
public class DicSerialize
|
||||
{
|
||||
/// <summary>
|
||||
/// シリアル化できる、KeyValuePairに代わる構造体
|
||||
/// </summary>
|
||||
/// <typeparam name="TKey">Keyの型</typeparam>
|
||||
/// <typeparam name="TValue">Valueの型</typeparam>
|
||||
[Serializable]
|
||||
public struct KeyAndValue<TKey, TValue>
|
||||
{
|
||||
public TKey Key;
|
||||
public TValue Value;
|
||||
|
||||
public KeyAndValue(KeyValuePair<TKey, TValue> pair)
|
||||
{
|
||||
Key = pair.Key;
|
||||
Value = pair.Value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// DictionaryをKeyAndValueのListに変換する
|
||||
/// </summary>
|
||||
/// <typeparam name="TKey">Dictionaryのキーの型</typeparam>
|
||||
/// <typeparam name="TValue">Dictionaryの値の型</typeparam>
|
||||
/// <param name="dic">変換するDictionary</param>
|
||||
/// <returns>変換されたKeyAndValueのList</returns>
|
||||
public static List<KeyAndValue<TKey, TValue>> ConvertDictionaryToList<TKey, TValue>(Dictionary<TKey, TValue> dic)
|
||||
{
|
||||
List<KeyAndValue<TKey, TValue>> lst = new List<KeyAndValue<TKey, TValue>>();
|
||||
foreach (KeyValuePair<TKey, TValue> pair in dic)
|
||||
{
|
||||
lst.Add(new KeyAndValue<TKey, TValue>(pair));
|
||||
}
|
||||
|
||||
return lst;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// KeyAndValueのListをDictionaryに変換する
|
||||
/// </summary>
|
||||
/// <typeparam name="TKey">KeyAndValueのKeyの型</typeparam>
|
||||
/// <typeparam name="TValue">KeyAndValueのValueの型</typeparam>
|
||||
/// <param name="lst">変換するKeyAndValueのList</param>
|
||||
/// <returns>変換されたDictionary</returns>
|
||||
public static Dictionary<TKey, TValue> ConvertListToDictionary<TKey, TValue>(List<KeyAndValue<TKey, TValue>> lst)
|
||||
{
|
||||
Dictionary<TKey, TValue> dic = new Dictionary<TKey, TValue>();
|
||||
foreach (KeyAndValue<TKey, TValue> pair in lst)
|
||||
{
|
||||
dic.Add(pair.Key, pair.Value);
|
||||
}
|
||||
return dic;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// DictionaryをXMLファイルに保存する
|
||||
/// </summary>
|
||||
/// <typeparam name="TKey">Dictionaryのキーの型</typeparam>
|
||||
/// <typeparam name="TValue">Dictionaryの値の型</typeparam>
|
||||
/// <param name="fileName">保存先のXMLファイル名</param>
|
||||
/// <param name="dic">保存するDictionary</param>
|
||||
public static void XmlSerialize<TKey, TValue>(string fileName, Dictionary<TKey, TValue> dic)
|
||||
{
|
||||
//シリアル化できる型に変換
|
||||
List<KeyAndValue<TKey, TValue>> obj = ConvertDictionaryToList(dic);
|
||||
|
||||
//XMLファイルに保存
|
||||
XmlSerializer serializer = new XmlSerializer(typeof(List<KeyAndValue<TKey, TValue>>));
|
||||
StreamWriter sw =
|
||||
new StreamWriter(fileName, false, new UTF8Encoding(false));
|
||||
serializer.Serialize(sw, obj);
|
||||
sw.Close();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// シリアル化されたXMLファイルをDictionaryに復元する
|
||||
/// </summary>
|
||||
/// <typeparam name="TKey">Dictionaryのキーの型</typeparam>
|
||||
/// <typeparam name="TValue">Dictionaryの値の型</typeparam>
|
||||
/// <param name="fileName">復元するXMLファイル名</param>
|
||||
/// <returns>復元されたDictionary</returns>
|
||||
public static Dictionary<TKey, TValue> XmlDeserialize<TKey, TValue>(
|
||||
string fileName)
|
||||
{
|
||||
//XMLファイルから復元
|
||||
XmlSerializer serializer = new XmlSerializer(typeof(List<KeyAndValue<TKey, TValue>>));
|
||||
StreamReader sr = new StreamReader(fileName, new UTF8Encoding(false));
|
||||
List<KeyAndValue<TKey, TValue>> obj =
|
||||
(List<KeyAndValue<TKey, TValue>>)serializer.Deserialize(sr);
|
||||
sr.Close();
|
||||
|
||||
//Dictionaryに戻す
|
||||
Dictionary<TKey, TValue> dic = ConvertListToDictionary(obj);
|
||||
return dic;
|
||||
}
|
||||
}
|
||||
}
|
25
LanguageXml.cs
Normal file
25
LanguageXml.cs
Normal file
@ -0,0 +1,25 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace NWService
|
||||
{
|
||||
public class LanguageXml
|
||||
{
|
||||
public LanguageXml()
|
||||
{
|
||||
this.messageMaps = new Dictionary<string, string>();
|
||||
}
|
||||
|
||||
public Dictionary<string, string> messageMaps = new Dictionary<string, string>();
|
||||
public string GetMessage(string key, string defaultMessage)
|
||||
{
|
||||
if (messageMaps.ContainsKey(key))
|
||||
{
|
||||
return messageMaps[key];
|
||||
}
|
||||
else
|
||||
{
|
||||
return defaultMessage;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
47
LanguageXmlLoader.cs
Normal file
47
LanguageXmlLoader.cs
Normal file
@ -0,0 +1,47 @@
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
using System.IO;
|
||||
|
||||
namespace NWService
|
||||
{
|
||||
public class LanguageXmlLoader
|
||||
{
|
||||
public static string GetPath()
|
||||
{
|
||||
return Path.Combine(Directory.GetCurrentDirectory(), "language.xml");
|
||||
}
|
||||
|
||||
public static LanguageXml Load()
|
||||
{
|
||||
if (!File.Exists(GetPath()))
|
||||
{
|
||||
return default;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
Dictionary<string, string> dic = DicSerialize.XmlDeserialize<string, string>(GetPath());
|
||||
return new LanguageXml()
|
||||
{
|
||||
messageMaps = dic
|
||||
};
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Console.WriteLine(e);
|
||||
return default;
|
||||
}
|
||||
}
|
||||
public static void Save(LanguageXml xml)
|
||||
{
|
||||
try
|
||||
{
|
||||
DicSerialize.XmlSerialize<string, string>(GetPath(), xml.messageMaps);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Console.WriteLine(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
131
NetworkService.cs
Normal file
131
NetworkService.cs
Normal file
@ -0,0 +1,131 @@
|
||||
using System.Net;
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace NWService
|
||||
{
|
||||
public class NetworkService
|
||||
{
|
||||
[DllImport("iphlpapi.dll", ExactSpelling = true)]
|
||||
private static extern int SendARP(int dstIp, int srcIp, byte[] mac, ref int macLen);
|
||||
|
||||
public static PingReply Ping(IPAddress iPAddress)
|
||||
{
|
||||
using (Ping ping = new Ping())
|
||||
{
|
||||
PingReply reply = ping.Send(iPAddress);
|
||||
return reply;
|
||||
}
|
||||
}
|
||||
|
||||
public static List<PingReply> SearchByPing(IPAddress targetIPv4)
|
||||
{
|
||||
int workThreadsMin;
|
||||
int ioThreadsMin;
|
||||
|
||||
ThreadPool.GetMinThreads(out workThreadsMin, out ioThreadsMin);
|
||||
ThreadPool.SetMinThreads(260, ioThreadsMin);
|
||||
|
||||
List<PingReply> avaIPs = new List<PingReply>();
|
||||
List<Task> allTasks = new List<Task>();
|
||||
|
||||
for (int i = 1 ; i <= 254 ; i++)
|
||||
{
|
||||
int hostPart = i;
|
||||
allTasks.Add(Task.Run(() => {
|
||||
List<string> separateIP = targetIPv4.ToString().Split('.').ToList();
|
||||
separateIP.RemoveAt(3);
|
||||
separateIP.Add(hostPart.ToString());
|
||||
string networkPart = string.Join(".", separateIP);
|
||||
PingReply reply = Ping(IPAddress.Parse(networkPart));
|
||||
if (reply != null && reply.Status == IPStatus.Success)
|
||||
{
|
||||
avaIPs.Add(reply);
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
Task t = Task.WhenAll(allTasks);
|
||||
try
|
||||
{
|
||||
t.Wait();
|
||||
}
|
||||
catch(Exception error)
|
||||
{
|
||||
Console.WriteLine(error);
|
||||
}
|
||||
|
||||
return avaIPs;
|
||||
}
|
||||
|
||||
public static List<DeviceInfo> SearchARP(IPAddress targetIPv4)
|
||||
{
|
||||
int workThreadsMin;
|
||||
int ioThreadsMin;
|
||||
|
||||
ThreadPool.GetMinThreads(out workThreadsMin, out ioThreadsMin);
|
||||
ThreadPool.SetMinThreads(260, ioThreadsMin);
|
||||
|
||||
List<DeviceInfo> avaIPs = new List<DeviceInfo>();
|
||||
|
||||
List<Task> allTasks = new List<Task>();
|
||||
for (int i = 1 ; i <= 254; i++)
|
||||
{
|
||||
int hostPart = i;
|
||||
allTasks.Add(Task.Run(() => {
|
||||
List<string> separateIP = targetIPv4.ToString().Split('.').ToList();
|
||||
separateIP.RemoveAt(3);
|
||||
separateIP.Add(hostPart.ToString());
|
||||
string networkPart = string.Join(".", separateIP);
|
||||
|
||||
int IPBytes = BitConverter.ToInt32(IPAddress.Parse(networkPart).GetAddressBytes(), 0);
|
||||
byte[] macAddressPointer = new byte[6];
|
||||
int physicalAddressLength = macAddressPointer.Length;
|
||||
|
||||
// ARP
|
||||
int ret = SendARP(IPBytes, 0, macAddressPointer, ref physicalAddressLength);
|
||||
if (ret == 0)
|
||||
{
|
||||
DeviceInfo info = new DeviceInfo(IPAddress.Parse(networkPart), macAddressPointer);
|
||||
avaIPs.Add(info);
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
Task t = Task.WhenAll(allTasks);
|
||||
try
|
||||
{
|
||||
t.Wait();
|
||||
}
|
||||
catch(Exception error)
|
||||
{
|
||||
Console.WriteLine(error);
|
||||
}
|
||||
|
||||
return avaIPs;
|
||||
}
|
||||
|
||||
public static IEnumerable<IPAddress> GetLocalIPv4()
|
||||
{
|
||||
List<IPAddress> list = new List<IPAddress>();
|
||||
NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
|
||||
foreach (NetworkInterface nic in nics)
|
||||
{
|
||||
if (nic.OperationalStatus == OperationalStatus.Up
|
||||
&& nic.NetworkInterfaceType != NetworkInterfaceType.Loopback
|
||||
&& nic.NetworkInterfaceType != NetworkInterfaceType.Tunnel)
|
||||
{
|
||||
UnicastIPAddressInformationCollection unicast = nic.GetIPProperties().UnicastAddresses;
|
||||
foreach (UnicastIPAddressInformation ip in unicast)
|
||||
{
|
||||
if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
|
||||
{
|
||||
list.Add(ip.Address);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
}
|
||||
}
|
10
NetworkService.csproj
Normal file
10
NetworkService.csproj
Normal file
@ -0,0 +1,10 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>disable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
74
OptionConsole.cs
Normal file
74
OptionConsole.cs
Normal file
@ -0,0 +1,74 @@
|
||||
using System.Net;
|
||||
|
||||
namespace NWService
|
||||
{
|
||||
public class OptionConsole
|
||||
{
|
||||
public static ServiceMode GetServiceMode(LanguageXml language)
|
||||
{
|
||||
var arry = Enum.GetValues(typeof(ServiceMode));
|
||||
for (int i = 0 ; i < arry.Length ; i++)
|
||||
{
|
||||
Console.WriteLine("[{0}]: {1}", i, language.GetMessage(arry.GetValue(i).ToString(), arry.GetValue(i).ToString()));
|
||||
}
|
||||
|
||||
Console.Write("{0} ", language.GetMessage("select_service_mode", "Please type service mode:"));
|
||||
string tInput = Console.ReadLine();
|
||||
if (string.IsNullOrWhiteSpace(tInput) || !int.TryParse(tInput, out int mode))
|
||||
{
|
||||
throw new ArgumentException(string.Format("{0}", language.GetMessage("exception_invalid_input_mode", "invalid input mode.")));
|
||||
}
|
||||
|
||||
if (mode < 0 || mode > arry.Length)
|
||||
{
|
||||
throw new ArgumentException(string.Format("{0}", language.GetMessage("exception_invalid_input_mode", "invalid input mode.")));
|
||||
}
|
||||
|
||||
return (ServiceMode) mode;
|
||||
}
|
||||
|
||||
public static IPAddress GetIPAddress(List<IPAddress> localIPv4, LanguageXml language)
|
||||
{
|
||||
for (int i = 0 ; i < localIPv4.Count(); i++)
|
||||
{
|
||||
Console.WriteLine("#{0}: {1}", i + 1, localIPv4[i]);
|
||||
}
|
||||
|
||||
Console.WriteLine("[0]: {0}", language.GetMessage("select_target_ipaddr", "Type target IPAddress."));
|
||||
Console.WriteLine("[1-]: {0}", language.GetMessage("select_local_ipaddr", "Select local IPAddress."));
|
||||
Console.Write("{0} ", language.GetMessage("type_mode", "Please type select mode:"));
|
||||
|
||||
string tMode = Console.ReadLine();
|
||||
if (string.IsNullOrWhiteSpace(tMode))
|
||||
{
|
||||
throw new ArgumentException(string.Format("{0}", language.GetMessage("exception_invalid_input_mode", "invalid input mode.")));
|
||||
}
|
||||
|
||||
if (!int.TryParse(tMode, out int mode))
|
||||
{
|
||||
throw new ArgumentException(string.Format("{0}", language.GetMessage("exception_invalid_input_mode", "invalid input mode.")));
|
||||
}
|
||||
|
||||
if (mode == 0)
|
||||
{
|
||||
Console.Write("{0} ", language.GetMessage("type_target_ipaddr", "Please type target IPAddress:"));
|
||||
string tmpAddr = Console.ReadLine();
|
||||
if (!IPAddress.TryParse(tmpAddr, out IPAddress addr))
|
||||
{
|
||||
throw new ArgumentException(string.Format("{0}", language.GetMessage("exception_invalid_input_ipaddr", "invalid input IPAddress.")));
|
||||
}
|
||||
|
||||
return addr;
|
||||
}
|
||||
|
||||
mode = mode - 1;
|
||||
|
||||
if (mode < 0 || mode > localIPv4.Count())
|
||||
{
|
||||
throw new ArgumentException(string.Format("{0}", language.GetMessage("exception_invalid_input_mode", "invalid input mode.")));
|
||||
}
|
||||
|
||||
return localIPv4[mode];
|
||||
}
|
||||
}
|
||||
}
|
135
Program.cs
Normal file
135
Program.cs
Normal file
@ -0,0 +1,135 @@
|
||||
using System.Net;
|
||||
using System.Net.NetworkInformation;
|
||||
|
||||
namespace NWService
|
||||
{
|
||||
public class Program
|
||||
{
|
||||
public static void Main()
|
||||
{
|
||||
try
|
||||
{
|
||||
LanguageXml language = LanguageXmlLoader.Load();
|
||||
|
||||
ServiceMode mode = OptionConsole.GetServiceMode(language);
|
||||
|
||||
List<IPAddress> localIPv4 = NetworkService.GetLocalIPv4().ToList();
|
||||
IPAddress targetIPv4 = OptionConsole.GetIPAddress(localIPv4, language);
|
||||
|
||||
switch(mode)
|
||||
{
|
||||
case ServiceMode.SEARCH_ARP:
|
||||
Search_ARP(targetIPv4, language);
|
||||
break;
|
||||
case ServiceMode.SEARCH_PING:
|
||||
Search_Ping(targetIPv4, language);
|
||||
break;
|
||||
default:
|
||||
Console.WriteLine("unknown mode...");
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch(Exception error)
|
||||
{
|
||||
Console.WriteLine(error.Message);
|
||||
}
|
||||
}
|
||||
|
||||
public static void Search_ARP(IPAddress targetIPv4, LanguageXml language)
|
||||
{
|
||||
try
|
||||
{
|
||||
List<DeviceInfo> findList = new List<DeviceInfo>();
|
||||
Task task = Task.Run(() => {
|
||||
findList.AddRange(NetworkService.SearchARP(targetIPv4));
|
||||
|
||||
Thread.Sleep(10);
|
||||
});
|
||||
|
||||
string[] frames = {"\","|","/"};
|
||||
int frameCount = 0;
|
||||
(int cpL, int cpT) = Console.GetCursorPosition();
|
||||
while (!task.IsCompleted)
|
||||
{
|
||||
Console.SetCursorPosition(cpL, cpT);
|
||||
frameCount++;
|
||||
int targetFrameNumber = frameCount%frames.Length;
|
||||
Console.WriteLine("{0} {1}", frames[targetFrameNumber], language.GetMessage("searching", "searching..."));
|
||||
Thread.Sleep(100);
|
||||
}
|
||||
|
||||
Console.SetCursorPosition(cpL, cpT);
|
||||
Console.WriteLine(" ");
|
||||
|
||||
if (findList.Count() == 0)
|
||||
{
|
||||
Console.WriteLine("{0}", language.GetMessage("empty_find_list", "Not found..."));
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine(string.Format(language.GetMessage("found_devices","Found {0} Devices."), findList.Count()));
|
||||
|
||||
foreach (DeviceInfo deviceInfo in findList)
|
||||
{
|
||||
Console.WriteLine("――――――――――――――――――――――――――――");
|
||||
Console.WriteLine("IP: {0}", deviceInfo.GetIPAddress().ToString());
|
||||
Console.WriteLine("Mac: {0}", deviceInfo.GetMacAddress());
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Console.WriteLine(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void Search_Ping(IPAddress targetIPv4, LanguageXml language)
|
||||
{
|
||||
try
|
||||
{
|
||||
List<PingReply> findList = new List<PingReply>();
|
||||
Task task = Task.Run(() => {
|
||||
findList.AddRange(NetworkService.SearchByPing(targetIPv4));
|
||||
Thread.Sleep(10);
|
||||
});
|
||||
|
||||
string[] frames = {"\","|","/"};
|
||||
int frameCount = 0;
|
||||
(int cpL, int cpT) = Console.GetCursorPosition();
|
||||
while (!task.IsCompleted)
|
||||
{
|
||||
Console.SetCursorPosition(cpL, cpT);
|
||||
frameCount++;
|
||||
int targetFrameNumber = frameCount%frames.Length;
|
||||
Console.WriteLine("{0} {1}", frames[targetFrameNumber], language.GetMessage("searching", "searching..."));
|
||||
Thread.Sleep(100);
|
||||
}
|
||||
|
||||
Console.SetCursorPosition(cpL, cpT);
|
||||
Console.WriteLine(" ");
|
||||
|
||||
if (findList.Count() == 0)
|
||||
{
|
||||
Console.WriteLine("{0}", language.GetMessage("empty_find_list", "Not found..."));
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine(string.Format(language.GetMessage("found_devices","Found {0} Devices."), findList.Count()));
|
||||
|
||||
foreach (var reply in findList)
|
||||
{
|
||||
Console.WriteLine("――――――――――――――――――――――――――――");
|
||||
Console.WriteLine("IP: {0}", reply.Address.ToString());
|
||||
Console.WriteLine("Time: {0}ms", reply.RoundtripTime);
|
||||
Console.WriteLine("Status: {0}", reply.Status);
|
||||
Console.WriteLine("Ttl: {0}", reply.Options.Ttl);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Console.WriteLine(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
8
ServiceMode.cs
Normal file
8
ServiceMode.cs
Normal file
@ -0,0 +1,8 @@
|
||||
namespace NWService
|
||||
{
|
||||
public enum ServiceMode
|
||||
{
|
||||
SEARCH_ARP,
|
||||
SEARCH_PING,
|
||||
}
|
||||
}
|
47
language.xml
Normal file
47
language.xml
Normal file
@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ArrayOfKeyAndValueOfStringString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
||||
<KeyAndValueOfStringString>
|
||||
<Key>SEARCH_ARP</Key>
|
||||
<Value>検索 [ARP]</Value>
|
||||
</KeyAndValueOfStringString>
|
||||
<KeyAndValueOfStringString>
|
||||
<Key>SEARCH_PING</Key>
|
||||
<Value>検索 [PING]</Value>
|
||||
</KeyAndValueOfStringString>
|
||||
<KeyAndValueOfStringString>
|
||||
<Key>searching</Key>
|
||||
<Value>検索中</Value>
|
||||
</KeyAndValueOfStringString>
|
||||
<KeyAndValueOfStringString>
|
||||
<Key>empty_find_list</Key>
|
||||
<Value>IPアドレスが見つかりませんでした。</Value>
|
||||
</KeyAndValueOfStringString>
|
||||
<KeyAndValueOfStringString>
|
||||
<Key>select_target_ipaddr</Key>
|
||||
<Value>対象のIPアドレスを入力する</Value>
|
||||
</KeyAndValueOfStringString>
|
||||
<KeyAndValueOfStringString>
|
||||
<Key>select_local_ipaddr</Key>
|
||||
<Value>ローカルIPアドレスから選択する</Value>
|
||||
</KeyAndValueOfStringString>
|
||||
<KeyAndValueOfStringString>
|
||||
<Key>type_target_ipaddr</Key>
|
||||
<Value>対象のIPアドレスを入力してください:</Value>
|
||||
</KeyAndValueOfStringString>
|
||||
<KeyAndValueOfStringString>
|
||||
<Key>type_mode</Key>
|
||||
<Value>モードを入力してください:</Value>
|
||||
</KeyAndValueOfStringString>
|
||||
<KeyAndValueOfStringString>
|
||||
<Key>exception_invalid_input_mode</Key>
|
||||
<Value>入力されたモードが正しくありません。</Value>
|
||||
</KeyAndValueOfStringString>
|
||||
<KeyAndValueOfStringString>
|
||||
<Key>exception_invalid_input_ipaddr</Key>
|
||||
<Value>入力されたIPアドレスが正しくありません。</Value>
|
||||
</KeyAndValueOfStringString>
|
||||
<KeyAndValueOfStringString>
|
||||
<Key>version</Key>
|
||||
<Value>1.0.0</Value>
|
||||
</KeyAndValueOfStringString>
|
||||
</ArrayOfKeyAndValueOfStringString>
|
Loading…
Reference in New Issue
Block a user