Cuando el Cliente intenta conectarse a una dirección IP desconectada, hay un tiempo de espera de más de 15 segundos ... ¿Cómo podemos reducir este tiempo de espera? ¿Cuál es el método para configurarlo?
El código que estoy usando para configurar una conexión de socket es el siguiente:
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
elcallback
y lo planeasEndConnect()
, si el socket ha sidoclosed
así, esto te dará una excepción. Así que asegúrese de verificar ...AsyncWaitHandle.WaitOne
señalará, pero el socket permanecerá desconectado.Mi toma:
fuente
SocketExtension
, todavía no ha usado.Connected
para ver si lo está y no está usandosocket.Connected = true;
para definirsuccess
.Acabo de escribir una clase de extensión para permitir tiempos de espera en las conexiones. Úselo exactamente como usaría los
Connect()
métodos estándar , con un parámetro adicional llamadotimeout
.fuente
socket.EndConnect
toma ~ 10 segundos para cerrar así la función devuelve no después del lapso de tiempo, pero después de intervalo de tiempo + endConnect tiempoNo programo en C # pero en C, resolvemos el mismo problema haciendo que el socket no se bloquee y luego colocando el fd en un ciclo de selección / encuesta con un valor de tiempo de espera igual a la cantidad de tiempo que estamos dispuestos a esperar para la conexión para triunfar.
Encontré esto para Visual C ++ y la explicación también se inclina hacia el mecanismo de selección / encuesta que expliqué antes.
En mi experiencia, no puede cambiar los valores de tiempo de espera de conexión por socket. Lo cambia para todos (ajustando los parámetros del sistema operativo).
fuente
puede que sea demasiado tarde, pero hay una solución ordenada basada en Task.WaitAny (c # 5 +):
fuente
Resolví el problema usando el método Socket.ConnectAsync en lugar del método Socket.Connect. Después de invocar el Socket.ConnectAsync (SocketAsyncEventArgs), inicie un temporizador (timer_connection), si se acabó el tiempo, verifique si la conexión del socket está conectada (si (m_clientSocket.Connected)), si no, aparece el error de tiempo de espera.
fuente
Mire esto en MSDN . No parece que pueda hacer esto con las propiedades implementadas en la clase Socket.
El póster de MSDN realmente resolvió su problema usando subprocesos. Tenía un hilo principal que llamaba a otros hilos que ejecutan el código de conexión durante un par de segundos y luego verifican la propiedad Conectada del socket:
¿Qué está tratando de hacer y por qué no puede esperar entre 15 y 30 segundos antes de que se agote el tiempo?
fuente
Tuve el mismo problema al conectarme a un Socket y se me ocurrió la siguiente solución: funciona bien para mí. '
fuente
Trabajé con Unity y tuve algún problema con BeginConnect y otros métodos asincrónicos de socket.
Hay algo que no entiendo, pero los ejemplos de código anteriores no me funcionan.
Así que escribí este código para que funcione. Lo pruebo en una red adhoc con android y pc, también en local en mi computadora. Espero que pueda ayudar.
y hay un perro guardián muy simple en C # para que funcione:
fuente
Esta es como la respuesta de FlappySock, pero le agregué una devolución de llamada porque no me gustó el diseño y cómo se devolvió el booleano. En los comentarios de esa respuesta de Nick Miller:
Entonces, para mí, parece que confiar en lo que se devuelve puede ser peligroso; prefiero usar
socket.Connected
. Configuré un booleano que acepta valores NULL y lo actualizo en la función de devolución de llamada. También descubrí que no siempre termina de informar el resultado antes de regresar a la función principal; también me ocupo de eso y lo hago esperar el resultado usando el tiempo de espera:Relacionado: ¿Cómo comprobar si estoy conectado?
fuente
Debería haber una propiedad ReceiveTimeout en la clase Socket.
Propiedad Socket.ReceiveTimeout
fuente
ReceiveTimeout
: esto es estrictamente para cuando se recibe conBeginReceive
yEndReceive
. No hay equivalente para cuando solo está viendo si está conectado.