.net - receive - sockets c# ejemplos
¿Cuál es la mejor manera de mantener vivo el control de socket en.NET? (3)
Como no puede usar la recepción de bloqueo (síncrono), tendrá que conformarse con el manejo asíncrono. Afortunadamente, es bastante fácil de hacer con .NET. Busque la descripción de BeginReceive () y EndReceive (). O mira este artículo o esto .
En cuanto al comportamiento de tiempo de espera, no encontré una descripción concluyente de esto. Como no está documentado de otra manera, debes asumir que es el comportamiento previsto.
Estoy buscando una forma de hacer un control de mantener vivo en .NET. El escenario es para UDP y TCP.
Actualmente, en TCP, lo que hago es conectar un lado y cuando no hay datos para enviar, envía un mantener vivo cada X segundos.
Quiero que el otro lado compruebe los datos, y si no se recibió en X segundos, para generar un evento más o menos.
Una forma en que traté de hacerlo fue hacer un bloqueo de recepción y configurar el RecieveTimeout del zócalo en X segundos. Pero el problema era que cada vez que pasaba el tiempo de espera, la recepción del zócalo arrojaba una excepción SocketExeception y el zócalo de este lado se cerraba, ¿es este el comportamiento correcto? ¿Por qué el socket se cierra / muere después del tiempo de espera en lugar de simplemente continuar?
No es aceptable verificar si hay datos y dormir (ya que podría estar retrasando la recepción de datos mientras duermo).
Entonces, ¿cuál es la mejor manera de hacerlo, y por qué el método que describí del otro lado está fallando?
De acuerdo con MSDN, una SocketException lanzada cuando ReceiveTimeout se excede en Recibir llamada no cerrará el socket. Hay algo más sucediendo en tu código.
Verifique los detalles de SocketException capturados, tal vez no sea un tiempo de espera después de todo. Quizás el otro lado de la conexión apague el enchufe.
Considere habilitar el seguimiento de red para diagnosticar el origen exacto de sus problemas: busque "Network Tracing" en MSDN (no puede proporcionarle un enlace, ya que ahora MSDN está inactivo).
Si literalmente significa "KeepAlive", intente lo siguiente.
public static void SetTcpKeepAlive(Socket socket, uint keepaliveTime, uint keepaliveInterval)
{
/* the native structure
struct tcp_keepalive {
ULONG onoff;
ULONG keepalivetime;
ULONG keepaliveinterval;
};
*/
// marshal the equivalent of the native structure into a byte array
uint dummy = 0;
byte[] inOptionValues = new byte[Marshal.SizeOf(dummy) * 3];
BitConverter.GetBytes((uint)(keepaliveTime)).CopyTo(inOptionValues, 0);
BitConverter.GetBytes((uint)keepaliveTime).CopyTo(inOptionValues, Marshal.SizeOf(dummy));
BitConverter.GetBytes((uint)keepaliveInterval).CopyTo(inOptionValues, Marshal.SizeOf(dummy) * 2);
// write SIO_VALS to Socket IOControl
socket.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null);
}