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
}