Red de conocimiento informático - Material del sitio web - En un programa en C, ¿cómo hacer referencia a variables de la función principal a una función personalizada?

En un programa en C, ¿cómo hacer referencia a variables de la función principal a una función personalizada?

Agregue el archivo de biblioteca ws2_32.lib al proyecto combinado ck2.h.

La función utilizada para cargar la biblioteca de sockets es

WSAStartup( wVersionRequested, ampwsa data); el primer parámetro indica la versión de la biblioteca de sockets que se va a cargar y los segundos parámetros son; se utiliza para almacenar la información de la versión devuelta.

wVersionRequested = make word(1, 1); Utilice MAKEWORD para establecer el valor del número de versión, donde el estado representa el número de versión principal.

Programación TCP:

Escritura del lado del servidor:

1. Crear un socket

SOCKET socketSrc = socket(AF_INET, SOCK_STREAM, 0);

El primer parámetro: la familia de direcciones especificada solo puede usar la versión 1.1 de AF_INET.

El segundo parámetro: especifica el tipo de socket. En la versión 1.1, se especificaron dos tipos: sockets de flujo SOCK_STREAM y sockets de datagramas SOCK_DREAM.

El tercer parámetro: indica el protocolo a utilizar. Si es 0, se seleccionará automáticamente el protocolo apropiado (recomendado).

2. Vincular socket

bind(socketSrc, (SOCKADDR *) & addrc, sizeof(SOCKADDR));

Primer parámetro: socket no vinculado

p>

El segundo parámetro: asigne una dirección al socket a través de la estructura SOCKADDR.

El tercer parámetro: el tamaño y la longitud del segundo parámetro

Estructura SOCKADDR: struct sockaddr_in {

Short sin _ family

u _ short sin _ port

Estructura en _ addr sin _ addr

char sin _ zero[8];

};

El primer miembro: familia de direcciones sin_family (este parámetro no utiliza secuencias de bytes de red, otros parámetros son secuencias de bytes de red).

El segundo miembro: sin_port especifica el puerto al que vincularse. Utilice htons para convertirlo en una secuencia de bytes de red porque es un entero corto sin signo.

La estructura del tercer miembro: in_addr se utiliza para almacenar la dirección in_addr. La estructura es la siguiente.

Dirección de entrada de estructura {

Unión

struct S _ un _ b

struct S _ un _ w

u _ long S _ addr

} S _ un

};

Se puede ver que in_addr es una estructura que contiene una unión, Se puede utilizar para almacenar diferentes tipos de datos, pero solo se puede almacenar un tipo de datos, según la selección. En nuestro programa, elegimos una variable entera larga S_addr para almacenar una dirección que debe convertirse al orden de bytes de la red mediante htonl.

l La diferencia entre htonl y htons es que uno convierte una secuencia de bytes de host de 32 bits en una secuencia de bytes de red TCP/IP de 32 bits, y el otro es de 16 bits.

l El propósito de inet_addr es convertir la cadena de dirección IP con puntos en la variable apropiada en in_addr.

L inet_ntoa convierte la dirección de red en una cadena en formato de dirección de punto estándar.

3. Escuche el socket:

listen(socketSrc, 5); //listen se usa para configurar el objeto de socket vinculado pero no conectado en modo de escucha y esperar próximas conexiones.

El segundo parámetro: indica la duración máxima de la conexión en espera. Si este parámetro se establece en SOMAXCONN, se establecerá en el valor máximo posible.

4. Aceptar conexiones:

Permitir que las conexiones en el conjunto de sockets escuchen y devuelvan el nuevo socket conectado.

SOCKET SOCKET conn = aceptar(SOCKET src, (SOCKADDR *) amp; add client amp; len);

El primer parámetro: el socket configurado en estado de escucha; >

El segundo parámetro: la estructura SOCKADDR se utiliza para almacenar la dirección de la entidad que solicita la conexión. Se crean diferentes estructuras según las diferentes familias de direcciones.

El tercer parámetro: la longitud de la dirección de almacenamiento. Este parámetro debe inicializarse antes de llamar a la función de aceptación; de lo contrario, la llamada fallará.

5. Después de completar el trabajo anterior, reciba y envíe datos a través de las funciones de recepción y envío.

recv(socketconn, recvbuf, 100, 0);

El primer parámetro es un socket conectado.

El segundo parámetro es la dirección del buffer utilizado para almacenar los datos recibidos.

El tercer parámetro indica el tamaño del buffer.

El cuarto parámetro indica que el modo de recepción está establecido en 0.

Escritura del cliente

6. El primer paso es crear el socket.

7. Luego haz una conexión.

connect(sockclient, (SOCKADDR *) amp; addsrc, sizeof(SOCKADDR));

El segundo parámetro es la dirección a conectar y el tercer parámetro es el tamaño de la dirección.

La parte de programación UDP explica en detalle la preparación de una sala de chat multiproceso sencilla.

Se basa en un protocolo sin conexión.

Entonces, al escribir un servidor, solo necesita vincular el socket para comenzar a enviar y recibir datos, y el cliente solo necesita crear un socket para comenzar a enviar y recibir datos.

Utilice las funciones recvfrom y sendto para operar.

Utilice close socket(m_socket); cierre un socket y utilice WSACleanup() para liberar la biblioteca de sockets