using System;using System.Net.Sockets;using System.Collections.Concurrent;using System.Threading;using System.Threading.Tasks;using System.Collections.Generic; public class PScan{ public static List Scan(string host,int from,int to,int conc,int timeoutMs){ var open=new ConcurrentBag(); var sem=new SemaphoreSlim(conc); var tasks=new List(); for(int p=from;p<=to;p++){ int port=p; sem.Wait(); tasks.Add(Task.Run(async ()=>{ try{ using(var c=new TcpClient()){ var t=c.ConnectAsync(host,port); var done=await Task.WhenAny(t,Task.Delay(timeoutMs)); if(done==t&&c.Connected){ open.Add(port); } } } catch{} finally{ sem.Release(); } })); } Task.WaitAll(tasks.ToArray()); var l=new List(open); l.Sort(); return l; } public static string Sweep(string prefix,int from,int to,int[] ports,int conc,int timeoutMs){ var hits=new ConcurrentDictionary>(); var sem=new SemaphoreSlim(conc); var tasks=new List(); for(int i=from;i<=to;i++){ string host=prefix+i; hits[host]=new ConcurrentBag(); foreach(int p in ports){ int port=p; string h=host; sem.Wait(); tasks.Add(Task.Run(async ()=>{ try{ using(var c=new TcpClient()){ var t=c.ConnectAsync(h,port); var done=await Task.WhenAny(t,Task.Delay(timeoutMs)); if(done==t&&c.Connected){ hits[h].Add(port); } } }catch{} finally{ sem.Release(); } })); } } Task.WaitAll(tasks.ToArray()); var sb=new System.Text.StringBuilder(); foreach(var kv in hits){ if(kv.Value.Count>0){ var l=new List(kv.Value); l.Sort(); sb.Append(kv.Key).Append('=').Append(string.Join(",",l)).Append(';'); } } return sb.ToString(); } public static string[] SweepLines(string prefix,int from,int to,int[] ports,int conc,int timeoutMs){ string r=Sweep(prefix,from,to,ports,conc,timeoutMs); if(r.Length==0) return new string[0]; return r.TrimEnd(';').Split(';'); } }