Lorsque le Client tente de se connecter à une adresse IP déconnectée, il y a un long timeout de plus de 15 secondes ... Comment réduire ce timeout? Quelle est la méthode pour le configurer?
Le code que j'utilise pour configurer une connexion socket est le suivant:
try
{
m_clientSocket = new Socket(
AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse(serverIp);
int iPortNo = System.Convert.ToInt16(serverPort);
IPEndPoint ipEnd = new IPEndPoint(ip, iPortNo);
m_clientSocket.Connect(ipEnd);
if (m_clientSocket.Connected)
{
lb_connectStatus.Text = "Connection Established";
WaitForServerData();
}
}
catch (SocketException se)
{
lb_connectStatus.Text = "Connection Failed";
MessageBox.Show(se.Message);
}
null
pour lecallback
et vous prévoyez de le faireEndConnect()
, si le socket a étéclosed
alors cela vous donnera une exception. Alors assurez-vous de vérifier ...AsyncWaitHandle.WaitOne
sera signalé, mais le socket restera non connecté.Ma prise:
la source
SocketExtension
, vous n'avez toujours pas utilisé.Connected
pour voir si vous l'êtes, et vous n'utilisez passocket.Connected = true;
pour définirsuccess
.Je viens d'écrire une classe d'extension afin de permettre des délais d'attente dans les connexions. Utilisez-le exactement comme vous utiliseriez les
Connect()
méthodes standard , avec un paramètre supplémentaire nommétimeout
.la source
socket.EndConnect
faut environ 10 secondes pour se fermer, donc la fonction retourne non pas après la période mais après la période + heure de fin deJe ne programme pas en C # mais en C, nous résolvons le même problème en rendant le socket non bloquant puis en plaçant le fd dans une boucle select / poll avec une valeur de timeout égale au temps que nous sommes prêts à attendre la connexion réussir.
J'ai trouvé cela pour Visual C ++ et l'explication se penche également vers le mécanisme de sélection / interrogation que j'ai expliqué précédemment.
D'après mon expérience, vous ne pouvez pas modifier les valeurs de délai de connexion par socket. Vous le changez pour tous (en réglant les paramètres du système d'exploitation).
la source
il est peut-être trop tard mais il existe une solution intéressante basée sur Task.WaitAny (c # 5 +):
la source
J'ai résolu le problème en utilisant la méthode Socket.ConnectAsync au lieu de la méthode Socket.Connect. Après avoir appelé Socket.ConnectAsync (SocketAsyncEventArgs), démarrez un minuteur (timer_connection), si le temps est écoulé, vérifiez si la connexion de socket est connectée (si (m_clientSocket.Connected)), sinon, affichez une erreur de temporisation.
la source
Vérifiez ceci sur MSDN . Il ne semble pas que vous puissiez le faire avec les propriétés implémentées dans la classe Socket.
L'affiche sur MSDN a en fait résolu son problème en utilisant le filetage. Il avait un thread principal qui appelait d'autres threads qui exécutent le code de connexion pendant quelques secondes, puis vérifient la propriété Connected du socket:
Qu'essayez-vous de faire et pourquoi ne peut-il pas attendre 15 à 30 secondes avant de se terminer?
la source
J'ai eu le même problème lors de la connexion à un socket et j'ai trouvé la solution ci-dessous, cela fonctionne très bien pour moi. »
la source
J'ai travaillé avec Unity et j'ai eu des problèmes avec BeginConnect et d'autres méthodes asynchrones de socket.
Il y a quelque chose que je ne comprends pas mais les exemples de code précédents ne fonctionnent pas pour moi.
J'ai donc écrit ce morceau de code pour le faire fonctionner. Je le teste sur un réseau adhoc avec android et pc, également en local sur mon ordinateur. J'espère que cela peut vous aider.
et il y a un chien de garde très simple sur C # pour le faire fonctionner:
la source
C'est comme la réponse de FlappySock, mais j'y ai ajouté un rappel parce que je n'aimais pas la mise en page et comment le booléen était renvoyé. Dans les commentaires de cette réponse de Nick Miller:
Donc, pour moi, il semble que se fier à ce qui est retourné peut être dangereux - je préfère l'utiliser
socket.Connected
. J'ai défini un booléen nullable et je le mets à jour dans la fonction de rappel. J'ai également trouvé qu'il ne finissait pas toujours de rapporter le résultat avant de revenir à la fonction principale - je gère cela aussi et je le fais attendre le résultat en utilisant le délai d'expiration:En relation: Comment vérifier si je suis connecté?
la source
Il doit y avoir une propriété ReceiveTimeout dans la classe Socket.
Socket.ReceiveTimeout, propriété
la source
ReceiveTimeout
- ceci est strictement pour la réception avecBeginReceive
etEndReceive
. Il n'y a pas d'équivalent lorsque vous voyez simplement si vous êtes connecté.