El lenguaje UDP de Linux C se da cuenta de la carga de archivos de video

Carga de archivos UDP

Dirección del proyecto gitee

A través del conector (AF_INET, SOCK_DGRAM, 0) conector de datos sugerido, realice la operación de carga de video del protocolo udp.

Se pueden cargar 10 millones de archivos, los más grandes no se prueban y deberían poder transferirse.

La implementación interna asigna memoria dinámicamente a través de malloc y agrega la identificación de usuario, el valor del índice del paquete y el identificador final al paquete de datos.

Estructura del paquete

La estructura del paquete enviado y recibido:

  • [índice] [bandera] [ID de usuario] [datos]
    • índice : valor del índice del paquete
    • flag : byte de identificación, si es 0, el paquete es un paquete intermedio, si es 1, es el paquete final, si es mayor que 1, significa que el primer paquete se está transmitiendo en este momento, y flag es el valor de la longitud.
    • userId : identificación de identificación de usuario.
    • datos : puntero de datos de cadena, la longitud máxima es 1 K.

Cliente

Inserte la descripción de la imagen aquí

Primero genere un userId, y luego el tercer byte de cada paquete es este userId, lo que indica que estos paquetes son enviados por el mismo cliente.

1. Inicie el paquete: envíe primero el paquete de longitud del archivo al cargar, y el servidor crea dinámicamente un búfer para almacenar datos de acuerdo con el paquete de longitud del archivo.
2. Paquete intermedio: el paquete intermedio envía datos y cada paquete se marca con un valor de índice a través de la variable i.
3. Paquete final: establezca el indicador en 1 al enviar un paquete final.

发送需要一定延迟 避免服务器处理不过来

Servidor

Inserte la descripción de la imagen aquí

  • 1. Defina una estructura para guardar el búfer de datos del usuario. Y defina una matriz global de tamaño 10, lo que significa que hasta diez usuarios pueden transmitir datos al mismo tiempo.
struct RecvData {
    
    
	// 标识用户
	int userId;
	// 是否结束,1表示结束
	int flag;
	// 数据缓存区
	// char buff[PACKET_SEQ][LENGTH];
	char **buff;
};
// 定义单个用户的结束数据类型
typedef struct RecvData RecvData;

// 定义10个用户存储区
RecvData datas[DATAS_LENGTH];
  • 2. Para recibir los datos, primero descomprímalos y extraiga el valor de los primeros tres bytes. Luego hay tres tipos de paquetes:

    • 1. Si index = 0 significa el primer paquete, que es un paquete de longitud, userId ocupa un búfer y le asigna memoria de longitud relevante.
    • 2. Si el índice no es igual a 0 y el indicador no es 1, significa que este paquete es un paquete intermedio y sus datos se copian en el buff [índice] del búfer donde se encuentra su ID de usuario.
    • 3. Si el indicador es 1, significa que este paquete es el paquete final, imprima la información relevante y luego abra un nuevo hilo para generar el archivo.
  • 3. Genere archivos. Los datos en el puntero buff del bloque RecvData correspondiente al userId especificado se eliminan gradualmente en el orden del índice, y luego se escriben en el archivo creado, y finalmente el bloque RecvData ocupado por el userId se limpia, listo para ser ocupado por el siguiente userId.

Supongo que te gusta

Origin blog.csdn.net/qq_43621091/article/details/109826010
Recomendado
Clasificación