Programación de sockets
También estoy aprendiendo recientemente y tengo un programa de chat en C++ que escribí, que 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
Antes de usarlo, debe vincular la función de biblioteca: Proyecto->Configuración ->Enlace- >Ingrese ws2_32.lib, ¡OK!
Programa del lado del servidor:
1. Cargar 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
#include
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, &wsaData );
if ( err != 0 ) {
return;
}//Cargar el socket biblioteca, si la adición falla, devolverá
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) { p>
WSACleanup( );
return;
}//Salir si no es 1.1
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM, 0);// Crea un socket.
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//Convertir cortos sin firmar al formato de orden de bytes de red
addrSrv .sin_family =AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
/ /Vincula el socket a una dirección y puerto local (bind)
listen(sockSrv,5);//Configura el socket en modo de escucha y prepárate para recibir solicitudes de los clientes (listen).
SOCKADDR_IN addrClient;//Definir familia de direcciones
int len=sizeof(SOCKADDR);//Inicializar este parámetro, este parámetro debe inicializarse
while( 1)
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&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,"Bienvenido %s a _ntoa(addrClient.sin_addr ));
//Utiliza el socket devuelto para comunicarte 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);//Esperar otra solicitud de usuario
}
}
Cliente. p>
#include
#include
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );Cargar 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 un 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*)&addrSrv,sizeof(SOCKADDR)); emite una solicitud de conexión (conexión) 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
}