Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Qué es Psock?

¿Qué es Psock?

¿Qué es una corriente? En pocas palabras, Stream es una herramienta abstracta para procesar datos basada en orientación a objetos. En la secuencia, se definen algunas operaciones básicas para procesar datos, como leer datos, escribir datos, etc. El programador realiza todas las operaciones en la secuencia sin preocuparse por el flujo real de datos en el otro extremo de la secuencia. Los flujos pueden manejar no sólo archivos, sino también memoria dinámica, datos de red y muchas otras formas de datos. Si es muy competente en las operaciones de transmisión y utiliza la conveniencia de las transmisiones en su programa, la eficiencia de la escritura de programas mejorará enormemente.

A continuación, lo ilustraré mediante cuatro ejemplos: cifrado de archivos EXE, tarjeta de felicitación electrónica, OICQ casero y transmisión de pantalla de red para ilustrar el uso de "flujo" en la programación de Delphi. Algunas de las técnicas de estos ejemplos alguna vez fueron mantenidas en secreto por muchos programas, pero ahora puedes citar el código directamente de ellas.

"Los edificios altos se elevan desde el suelo". Antes de analizar los ejemplos, primero debemos comprender los conceptos y funciones básicos de las corrientes. Sólo entendiendo estas cosas básicas podremos pasar al siguiente paso. Asegúrese de comprender estos métodos básicos cuidadosamente. Por supuesto, si ya estás familiarizado con estos métodos, puedes saltarte este paso.

I.Conceptos básicos de declaración de flujo y función en Delphi

En Delphi, la clase base de todos los objetos de flujo es la clase TStream, que define las mismas propiedades y métodos.

Las propiedades definidas en la clase TStream se describen a continuación:

1. Tamaño: Esta propiedad devuelve el tamaño de los datos del flujo en bytes.

2. Posición: Este atributo controla la posición del puntero de acceso en la secuencia.

Se definen cuatro métodos virtuales en la secuencia:

1. Lectura: este método lee datos de la secuencia. El prototipo de función es:

Función Read(var Buffer;Count:Longint):Longint;virtual;abstract;

El parámetro Buffer es el búfer que se coloca al leer datos, y Count es el requerido El número de bytes de datos leídos. El valor de retorno del método es el número real de bytes leídos, que puede ser menor o igual al valor especificado en Recuento.

2. Escritura: este método escribe datos en el flujo de datos. El prototipo de función es:

Función de escritura (var Buffer;Count:Longint):Longint;virtual;abstract;

El parámetro Buffer es el búfer que se escribirá en el flujo de datos. y Count son los datos La longitud en bytes, este método devuelve el número de bytes realmente escritos en el flujo de datos.

3. Buscar: este método realiza el movimiento del puntero de lectura de la secuencia. El prototipo de función es:

Búsqueda de función (Desplazamiento: Entero largo; Origen: Palabra): Entero largo; virtual;

El parámetro Desplazamiento es el byte de desplazamiento y el parámetro Puntos de origen; Para determinar el valor real de Offset Significado, los valores posibles son los siguientes:

soFromBeginning:Offset se utiliza para mover el puntero desde el principio de los datos. En este momento, Offset debe ser mayor o igual a cero.

soFromCurrent:Offset es la posición del puntero en relación con el puntero actual después del movimiento.

soFromEnd:Offset es la posición relativa al final de los datos después de mover el puntero. La compensación debe ser menor o igual a cero. El valor de retorno de este método es la posición del puntero después del movimiento.

4. Setsize: Este método cambia el tamaño de los datos. Prototipo de función:

Función Setsize(NewSize:Longint);virtual;

Además, la clase TStream también define algunos métodos estáticos:

1. El propósito del método es leer datos de la posición actual en la secuencia.

Prototipo de función:

Procedimiento ReadBuffer (var Buffer; Count: Longint);

La definición del parámetro es la misma que la lectura anterior. Nota: Cuando la cantidad de bytes de datos leídos es diferente de la cantidad de bytes necesarios para leer, se generará una excepción EReadError.

2. WriteBuffer: La función de este método es escribir datos en la posición actual de la secuencia. El prototipo de la función es:

Procedimiento WriteBuffer(var Buffer;Count:Longint);

La definición del parámetro es la misma que la de Escritura anterior. Nota: Cuando la cantidad de bytes de datos escritos es diferente de la cantidad de bytes que se escribirán, se generará una excepción EWriteError.

3. CopyFrom: este método se utiliza para copiar flujos de datos de otros flujos de datos. El prototipo de función es:

Función CopyFrom(Source:TStream;Count:Longint):Longint;

El parámetro Source es el flujo que proporciona los datos y Count es el número de bytes de datos copiados. Cuando Count es mayor que 0, CopyFrom copiará Count bytes de datos de la posición actual del parámetro Source; cuando Count es igual a 0, CopyFrom establecerá la propiedad Position del parámetro Source en 0 y luego copiará todos los datos de Source; ;

TStream tiene otras clases derivadas, la más común es TFileStream. La más utilizada es la clase TFileStream. Para acceder a un archivo usando la clase TFileStream, primero crea una instancia. Su declaración es la siguiente:

constructor Create(const Filename:String;Mode:Word);

Filename es el nombre del archivo (incluida la ruta) y el parámetro Mode es el forma de abrir el archivo, incluido el modo Abrir archivo y el modo Disfrutar, los posibles valores y significados son los siguientes:

Modo Abrir:

fmCreate: Crea un archivo con el nombre de archivo especificado, si el archivo ya existe, ábralo.

fmOpenRead: abre el archivo especificado en modo de solo lectura

fmOpenWrite: abre el archivo especificado en modo de solo escritura

fmOpenReadWrite: abre el archivo especificado en modo escritura

p>

**Modo cobertura:

fmShareCompat:** **El modo compartir es compatible con FCB

fmShareExclusive: No permite otros programas abran el archivo de cualquier manera

fmShareDenyWrite: no permita que otros programas abran el archivo para escribir

fmShareDenyRead: no permita que otros programas abran el archivo para leer

fmShareDenyRead: no permite que otros programas abran el archivo para leerlo. Abra el archivo de cualquier forma

fmShareDenyWrite: no permite que otros programas abran el archivo

fmShareDenyNone: Otros programas pueden abrir el archivo de cualquier forma

TStream también tiene una clase derivada TMemoryStream, muy utilizada en la práctica. Se llama MemoryStream, lo que significa que crea un objeto de flujo en la memoria. Sus métodos y funciones básicos son los mismos que los anteriores.

Bien, con los conocimientos básicos anteriores, podemos comenzar nuestro viaje de programación.

------------------------------------------- ----- ----------------------------

2. Aplicación práctica uno: usar flujos para crear Cifradores de archivos EXE, agrupaciones, archivos autoextraíbles e instaladores

Veamos primero cómo crear un cifrador de archivos EXE.

El principio del cifrador de archivos EXE: crea dos archivos, uno se usa para agregar recursos al interior del otro archivo EXE, llamado programa complementario. Otro archivo EXE que se agrega se llama archivo de encabezado. La función del programa agregar es leer el contenido agregado al archivo. La estructura de archivos EXE de Windows es relativamente compleja. Algunos programas tienen sumas de verificación. Cuando descubren que han sido modificados, se considerarán infectados con virus y se negarán a ejecutarse. Entonces agregamos el archivo a nuestro propio programa para que la estructura del archivo original no cambie. Primero escribimos una función de adición que agrega un archivo como una secuencia al final de otro archivo. Gratis;

Fuente.Gratis;

fin;

excepto

Resultado:=Falso;

Salir ;

end;

Resultado:=True;

end;

Con la base anterior, no nos resulta difícil Entienda esto Cómo funciona la función. El parámetro SourceFile es el archivo que se agregará y el parámetro TargetFile es el archivo de destino que se agregará. Por ejemplo, puede agregar a.exe a b.exe: Cjt_AddtoFile ('a.exe', b.exe'); devuelve True si la adición se realiza correctamente, false en caso contrario.

Basándonos en la función anterior, podemos escribir la función de lectura opuesta:

Función Cjt_LoadFromFile(SourceFile,TargetFile:string):Boolean;

var

Fuente.TFileStream;