Comment configurer socket délai de connexion
Lorsque le Client essaie de se connecter à un déconnecté de l'adresse IP, il y a un long délai d'attente de plus de 15 secondes... Comment peut-on réduire ce délai d'attente? Quelle est la méthode pour le configurer?
Le code que j'utilise pour configurer une connexion de socket est comme suit:
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);
}
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé ceci. Plus simple que l'on a accepté de répondre, et travaille avec .NET v2
null
pour lacallback
et que vous envisagez deEndConnect()
, si le socket a étéclosed
puis cela vous donnera une exception. Donc, assurez-vous de vérifier...AsyncWaitHandle.WaitOne
sera signalée, mais la prise ne sont toujours pas connectés.socket.Connected
dans une routine de rappel qui devrait être là (mais ne l'est pas...pourquoi?). Si il va dans le bloc exception d'untry...catch
dans cette fonction de rappel, vous définissez le Booléen à false là.De mon point de vue:
SocketExtension
, vous n'avez pas encore utilisé.Connected
pour voir si vous l'êtes, et vous ne l'utilisez passocket.Connected = true;
de définirsuccess
.Je viens d'écrire une classe d'extension afin de permettre à l'expiration des délais pour les connexions. L'utiliser exactement comme vous le feriez utiliser la norme
Connect()
méthodes, avec un paramètre supplémentaire nommétimeout
.socket.EndConnect
prend environ 10 secondes pour fermer alors la fonction retourne pas après ce laps de temps, mais après un laps de temps+endConnect tempsJe n'ai pas de programme en C# mais en C, nous avons à résoudre le même problème en faisant le socket non bloquant et en mettant ensuite le fd dans un select/poll boucle avec un délai d'attente valeur égale à la quantité de temps que nous sommes prêts à attendre pour se connecter à réussir.
J'ai trouvé cette pour Visual C++, et l'explication qu'il y a aussi infléchit vers le select/poll mécanisme je l'ai expliqué avant.
Dans mon expérience, vous ne pouvez pas modifier connecter valeurs de délai d'expiration par socket. Vous la changez pour toutes les (réglage par OS paramètres).
J'ai résolu le problème en utilisant un Socket.ConnectAsync plutôt la Méthode de la Prise.Méthode De Connexion.
Après l'invocation de la Socket.ConnectAsync(SocketAsyncEventArgs), démarrer une minuterie (timer_connection), si, vérifiez si la connexion de socket est connecté (si(m_clientSocket.Connecté)), si ce n', pop up erreur de dépassement de délai.
Le vérifier sur MSDN. Il ne semble pas que vous pouvez faire cela avec la mise en œuvre des propriétés de la classe Socket.
L'affiche sur MSDN fait résolu son problème à l'aide du filetage. Il avait un thread principal qui appelle à d'autres threads qui exécutent le code de connexion pour un couple de secondes, puis vérifiez la propriété Connected de la douille:
Ce que vous essayez de faire, et pourquoi ne peut-il pas attendre 15 à 30 secondes avant d'expirer?
J'ai eu le Même problème lors de la connexion à un Socket et je suis venu avec le dessous de solution ,Il fonctionne très bien pour moi.
`
J'ai travaillé avec l'Unité et avait un problème avec le BeginConnect et d'autres méthodes asynchrones à partir de socket.
Il y a quelque chose que je ne comprends pas, mais les exemples de code avant ne fonctionne pas pour moi.
J'ai donc écrit ce morceau de code pour le faire fonctionner. Je l'ai testé sur un réseau ad hoc avec android et pc, également en local sur mon ordinateur. J'espère que ça peut aider.
et il y a une très simple chien de garde sur le C# pour le faire fonctionner:
C'est comme FlappySock réponse, mais j'ai ajouté un rappel parce que je n'ai pas aimé la mise en page et comment le Booléen a se retourné. Dans les commentaires de cette réponse de Nick Miller:
Donc, pour moi, il semble s'appuyant sur ce qui est retourné peut être dangereux, je préfère utiliser
socket.Connected
. J'ai mis un Boolean nullable et le mettre à jour dans la fonction de callback. J'ai aussi trouvé qu'il n'est pas toujours avertir le résultat avant de retourner à la fonction principale - je gérer pour que, aussi, et le faire attendre pour le résultat de l'utilisation de la temporisation:Connexes: Comment vérifier si je suis connecté?
il pourrait être trop tard mais il est soignée solution basée sur la Tâche.WaitAny (c# 5 +) :
Il devrait y avoir un ReceiveTimeout propriété de la classe Socket.
Socket.ReceiveTimeout Propriété
ReceiveTimeout
- c'est strictement pour lors de la réception avecBeginReceive
etEndReceive
. Il n'y a pas d'équivalent pour quand vous êtes juste de voir si vous êtes connecté.