La Red de Conocimientos Pedagógicos - Currículum vitae - Programación de sockets

Programación de sockets

También estoy aprendiendo un programa de chat en C que escribí recientemente. El programa de chat es un poco grande. Lo siguiente está escrito en C

Hay tres tipos de programación de sockets, sockets de transmisión. (SOCK_STREAM), socket de datagrama (SOCK_DGRAM), socket sin formato (SOCK_RAW); la programación de socket basada en TCP utiliza socket de transmisión (SOCK_STREAM). Socket de datagrama (SOCK_DGRAM) basado en UDP.

1. Pasos de programación para el socket de transmisión TCP

La función de biblioteca debe estar vinculada antes de su uso: project-gt; ; Ingrese ws2_32.lib, ¡OK!

Programa del lado del servidor:

1. Cargue la biblioteca de sockets

2.

3. Vincular el socket a una dirección y puerto local (vincular).

4. Configure el socket en modo de escucha y prepárese para recibir las solicitudes de los clientes (escuchar).

5. Espere a que llegue la solicitud del cliente; cuando llegue la solicitud, acepte la solicitud de conexión y devuelva un nuevo socket (aceptar) correspondiente a la conexión.

6. Utilice el socket devuelto para comunicarse con el cliente (enviar/recibir).

7. Regrese y espere otra solicitud de cliente.

8. Cerrar el enchufe.

Programa cliente:

1. Cargue la biblioteca de sockets

2.

3. Enviar una solicitud de conexión (connect) al servidor.

4. Comunicarse con el servidor (enviar/recibir).

5. Cierre el socket

El código del lado del servidor es el siguiente:

#include lt; //Agregar archivo de encabezado

p>

#include lt; stdio.hgt; //Carga los archivos de encabezado de entrada y salida estándar

void main()

{

WORD wVersionRequested; // Número de versión

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD(1, 1); //versión 1.1 del socket

err = WSAStartup(wVersionRequested, amp;wsaData);

if (err != 0) {

return;

}/ /Cargando conjunto Conéctese a la biblioteca de fuentes y regrese si la adición falla

if ( LOBYTE( wsaData.wVersion ) != 1 ||

HIBYTE( wsaData.wVersion ) != 1 ) {

WSACleanup( );

return

}//Salir si no es 1.1

SOCKET sockSrv=socket (AF_INET, SOCK_STREAM, 0); //Crear conector.

SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //Convertir corto sin firmar al formato de orden de bytes de red

addrSrv .sin_family =AF_INET;

addrSrv.sin_port=htons(6000);

bind(sockSrv, (SOCKADDR*)amp; addrSrv, sizeof(SOCKADDR));

// Vincular el socket a una dirección y puerto local (bind)

listen(sockSrv, 5); //Configurar el socket en modo de escucha y prepararse para recibir solicitudes de los clientes (escuchar).

SOCKADDR_IN addrClient; //Definir familia de direcciones

int len=sizeof(SOCKADDR); //Inicializa este parámetro, este parámetro debe inicializarse

while( 1)

{

SOCKET sockConn=accept(sockSrv, (SOCKADDR*)amp; addrClient, amp; len); //El tercer parámetro de aceptar debe tener un valor inicial.

// Espere a que llegue la solicitud del cliente; cuando llegue la solicitud, acepte la solicitud de conexión y devuelva un nuevo socket (aceptar) correspondiente a la conexión.

//El programa se bloquea aquí

char sendBuf[100];

sprintf(sendBuf, "Bienvenidos a _ntoa(addrClient.sin_addr));

//Utilice el socket devuelto para comunicarse con el cliente (send/recv)

send(sockConn, sendBuf, strlen(sendBuf) 1, 0

char recvBuf[100];

recv(sockConn, recvBuf, 100, 0,

printf("s\n", recvBuf);

closesocket(sockConn); //Cerrar el socket.

Esperando otra solicitud de usuario

}

}

El código del cliente es el siguiente:

#include lt;Winsock2.hgt;

p>

#include lt;stdio.hgt;

void main()

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, amp; wsaData ); Cargando biblioteca de sockets

if ( err != 0 ) {

return;

}

if ( LOBYTE( wsaData ); .wVersion ) != 1 ||

HIBYTE( wsaData.wVersion ) != 1 ) {

WSACleanup(

return;

}

SOCKET sockClient=socket(AF_INET, SOCK_STREAM, 0); Crear socket (socket).

SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

addrSrv.sin_family=AF_INET;

addrSrv.sin_port=htons(6000);

connect(sockClient, (SOCKADDR*)amp; addrSrv, sizeof(SOCKADDR)); Emitir una solicitud de conexión (conectar) al servidor.

char recvBuf[100]; comunicarse con el servidor (enviar/recv).

recv(sockClient, recvBuf, 100, 0);

printf("s\n", recvBuf);

send(sockClient, "Esto es lisi", strlen("Esto es lisi") 1, 0);

closesocket(sockClient); Cierra el socket.

WSACleanup(); //Esta función debe llamarse para borrar parámetros

}