私は、LAN上の特定のポート上のすべてのリスニングサーバをチェックする方法について読んできました。最後に、私が望むように動作するコードを書きました。
私はSystem.Threading.Tasks.Parallelを使用して、すべての254個のIPアドレスにできるだけ早く接続します。
ex: 192.168.1。 - 192.168.1。私は必要なものSocket.ConnectAsyncのタイムアウトを設定するには?
それは印刷に約15〜20秒かかりますので、これらの接続試行のタイムアウトを設定することです。それが失敗したときに「接続に失敗しました」..ので、私はそれをどのように行うのですか?ここで
は、クライアントのコードです:
static void Main(string[] args)
{
Console.WriteLine("Connecting to IP addresses has started. \n");
Parallel.For(1, 255, i =>
{
Connect("192.168.1." + i);
});
Console.ReadLine();
}
private static void Connect(string ipAdd)
{
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
SocketAsyncEventArgs e = new SocketAsyncEventArgs();
IPEndPoint ipEnd = new IPEndPoint(IPAddress.Parse(ipAdd), 9990);
e.RemoteEndPoint = ipEnd;
e.UserToken = s;
e.Completed += new EventHandler<SocketAsyncEventArgs>(e_Completed);
Console.WriteLine("Trying to connect to : " + ipEnd);
s.ConnectAsync(e);
}
private static void e_Completed(object sender, SocketAsyncEventArgs e)
{
if (e.ConnectSocket != null)
{
StreamReader sr = new StreamReader(new NetworkStream(e.ConnectSocket));
Console.WriteLine("Connection Established : " + e.RemoteEndPoint + " PC NAME : " + sr.ReadLine());
}
else
{
Console.WriteLine("Connection Failed : " + e.RemoteEndPoint);
}
}
サーバコード:
static void Main(string[] args)
{
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ep = new IPEndPoint(IPAddress.Any,9990);
server.Bind(ep);
server.Listen(100);
Socket client = server.Accept();
NetworkStream stream = new NetworkStream(client);
StreamWriter sw = new StreamWriter(stream)
sw.WriteLine(System.Environment.MachineName);
sw.Flush();
sw.Dispose();
stream.Dispose();
client.Dispose();
server.Dispose();
}
それはより良い私に教えてくださいする任意のヒントや注意事項がある場合。私は[.Net 4.0]ソケットTCPを使用しています
私の悪い英語とおかげで申し訳ありません前もって。
15〜20秒は1回の接続試行のための合理的と254回の試みのために非常に良いようです。サーバーがダウンしている場合、私のブラウザーは '回転矢印'モードのブラウザーよりも長い時間を費やしています。 –
実際には、リンクにダイヤルアップモデムがある場合、20秒が短すぎます。幸いにも、そのような恐怖はほとんどすべてが死亡した。 –
@MartinJamesこれは私が言及したようにローカルエリアネットワークです。利用可能なホストを示すほとんどのゲームとアプリケーション.. 10秒以内に結果を出してください。私は彼らがより良いアルゴリズムとそれを得る方法を使用していることを知っている..しかし、私は短時間でそれを必要とする –