Red de conocimiento informático - Computadora portátil - Implementación en C# de un marco de recepción de paquetes asíncrono de subprocesos múltiples

Implementación en C# de un marco de recepción de paquetes asíncrono de subprocesos múltiples

Hace unos días vi un problema de socket C# en un blog y me recordó un proyecto de servidor de recepción de flujo de tráfico provincial que realicé en 2007. Los requisitos básicos en ese momento eran los siguientes

Recibir paquetes de tráfico informados por equipos de observación automática a través de la tarjeta de red inalámbrica de Internet y los enchufes. El plan de escala K es que habrá aproximadamente un equipo de observación automática en la provincia (en enero de 2012, solo había uno. En ese momento, VS solo había sido lanzado durante más de un año y no había sido lanzado). Hace mucho que entré en contacto con C#, así que busqué en Google en redes nacionales y extranjeras, con la esperanza de encontrar algunas ideas y códigos para usar C# para resolver problemas de comunicación de socket. Finalmente, encontré los dos artículos que me resultaron más útiles. Uno era el marco del receptor de socket escrito por una persona china que aplicó la sesión de socket del cliente independiente (sesión), y el otro era un artículo sobre el marco del receptor de socket. El concepto de sesión de Socket (Session) me dio una idea general del marco para un servidor receptor. Otro artículo escrito por un estadounidense propuso tecnología de recepción de paquetes de datos segmentados y multiproceso e introdujo muchos detalles de la implementación de Socket asíncrono de subprocesos múltiples. ruta técnica del autor para manejar Socket Receiver de manera asincrónica y de subprocesos múltiples

Específico

Durante la implementación y prueba específicas, también se descubrió que el autor puede usar C# para resolver Socket problemas de comunicación. p>

El autor recuerda vagamente que el nombre del autor del espacio de marco nacional es ibm Think. El personal de IBM lo conoció a través del correo electrónico. El autor que vive en Shenzhen le hizo varias preguntas y. Discutí varios temas con él. Desafortunadamente, no puedo encontrar los puntos técnicos clave ahora cuando vuelvo a buscar el texto original o el correo electrónico. Tengo que aprovechar esta oportunidad para compartir este documento con estos dos expertos técnicos y colegas que nunca lo han hecho. Conocí antes. También espero que el artículo o el código fuente puedan brindar a los lectores alguna inspiración y ayuda útiles.

Ideas técnicas principales

Todo el sistema consta de tres subprocesos centrales administrados por el grupo de subprocesos NET.

El hilo ListenClientRequest() realiza un bucle para escuchar las solicitudes de conexión del cliente. Si es así, detectará la IP del cliente para determinar si es el mismo dispositivo de observación, luego creará un objeto TSession de cliente y recibirá el paquete llamando al método Socket BeginReceive() de forma asincrónica. EndReceive() procesa el paquete de datos. El hilo de procesamiento de paquetes de datos HandleDatagrams() realiza un bucle para verificar la cola de paquetes de datos _datagramQueue para completar el trabajo de analizar el paquete de datos, determinar el tipo y almacenarlo. El hilo de verificación del estado del cliente CheckClientState() recorre la tabla de sesión del cliente _sessionTable para determinar la validez del objeto de sesión y establecer el tiempo de espera. Determinar si el objeto de sesión es válido Establecer el indicador de cierre de sesión de tiempo de espera Borrar el objeto de sesión no válido y liberar sus recursos Introducción a las clases principales

¿El sistema consta de tres clases principales?

TDatagramReceiver La clase de proceso central del sistema, utilizada para establecer conexiones de socket, procesar y almacenar paquetes de datos y limpiar los recursos del sistema. Esta clase proporciona todas las propiedades y métodos públicos TSession Una sesión de cliente consta del objeto de socket de cada cliente, su propio búfer de datos y un hilo de limpieza.

TDatagram (clase de paquete) Determinar la clase de paquete ¿Analizar el paquete?

Funciones y códigos clave

La siguiente es una breve descripción del código de implementación clave de la clase principal TDatagramReceiver

?Inicio del sistema

Inicio del sistema El método StartReceiver() primero limpiará los recursos, creará una conexión a la base de datos e inicializará algunos valores de recuento.

Luego creará un objeto de socket del lado del servidor para escuchar y finalmente llamará al método estático. ThreadPool QueueUserWorkItem() para crearlo en el grupo de subprocesos. Un subproceso de procesamiento central

Código ///?StartReceiver/// public bool StartReceiver(){ try { _stopReceiver = true

this Close(); ;

si (! this ConnectDatabase()) devuelve falso;

_ clientCount = ; _datagramQueueCount = ; _errorDatagramCount = ; 201311/12226