Comment définir un délai d'attente de la Prise.ConnectAsync?
J'ai lu sur la façon de rechercher tous les serveur d'écoute sur un port spécifique sur LAN et enfin, j'ai écrit un peu de code que ça fonctionne comme je veux.
Je suis en utilisant le Système.Le filetage.Les tâches.En parallèle à se connecter à tous les 254 Adresses IP aussi vite que possible
ex : 192.168.1.1 - 192.168.1.254
Ce dont j'ai besoin est de définir un délai d'attente pour ces tentatives de connexion, car il faut environ 15 à 20 secondes pour imprimer : "Échec de la Connexion" quand il ne parvient pas .. donc Comment dois-je faire?
Voici le Code Client:
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);
}
}
Code Serveur:
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();
}
Si il n'y a aucun soupçon ou de la notification qui le fait mieux s'il vous plaît dites-moi. Je suis à l'aide de [.Net 4.0] Sockets TCP
Désolé pour mon mauvais anglais et merci d'avance..
En fait, en 20 secondes, c'est beaucoup trop court si le lien a un modem d'accès à distance. Heureusement, de telles horreurs ont presque tous disparu.
c'est un réseau local comme je l'ai mentionné .. la plupart des jeux et des application qui affiche des hôtes disponibles .. donner le résultat en moins de 10 secondes. comme [pc n'importe où, netsupport, la demi-vie ..etc] je sais qu'ils ont une meilleure utilisation de l'algorithme et les façons de s' .. mais j'en ai besoin dans un court laps de temps
Je ne vois pas beaucoup de mal avec votre anglais 🙂
OriginalL'auteur Murhaf Sousli | 2012-03-16
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé une solution.
d'abord ajouter tous créé des sockets pour une liste de type SocketAsyncEventArgs ou le type deSocket ou
ensuite, l'utilisation du Système.Les minuteries.Minuterie de fermeture de tous dans l'attente de la connexion et de la connectés les uns après lorsque la minuterie tiques qui est au bout de 5 secondes. (la minuterie.Intervalle = 5000).
Code Client:
OriginalL'auteur Murhaf Sousli
Je ne pouvais pas trouver tout intégré dans le mécanisme de dépassement. Vous devez définir une minuterie et d'interrompre les connexions lorsqu'il déclenche. Quelque chose de semblable à ceci: Comment configurer socket délai de connexion
j'aurais peut-être définir une minuterie pour tous .. mais je préfère encore une meilleure idée
Vous avez seulement besoin d'une minuterie, parce que c'est le même délai d'attente pour toutes les connexions.
+1 pour le même délai d'attente pour toutes les connexions".
ne pas faire fonctionner sur leur propre fils. Voir cette réponse à une question, j'ai demandé un temps de retour: stackoverflow.com/a/31833/3279
OriginalL'auteur zmbq