Para continuar con esta sección recomiendo antes seguir la primera parte: Sockets en C (Parte I) – Linux
Esta sección la quiero dedicar para subir dos ejemplos de un chat interactivo utilizando sockets de flujo entre un servidor y un cliente.
Ejemplo1:
Servidor:
// Ficheros de cabecera #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> //Funcion principal int main(int argc, char **argv) { //Definir variables,estructuras struct sockaddr_in server; struct sockaddr_in client; int fd,fd2,longitud_cliente,numbytes,puerto; char buf[1024]; //Para recibir mensaje char enviar2[1024]; //Para enviar mensaje char enviar[1024]; //Para enviar mensaje system("clear"); printf("La direccion del servidor es 127.0.0.1\n\n"); printf("Por favor introduzca el puerto de escucha: \n\n"); scanf("%d",&puerto); server.sin_family= AF_INET; server.sin_port = htons(puerto); server.sin_addr.s_addr = INADDR_ANY; bzero(&(server.sin_zero),8); //Definicion de socket if (( fd=socket(AF_INET,SOCK_STREAM,0) )<0){ perror("Error de apertura de socket"); exit(-1); } //Avisar al sistema que se creo un socket if(bind(fd,(struct sockaddr*)&server, sizeof(struct sockaddr))==-1) { printf("error en bind() \n"); exit(-1); } //Establecer el socket en modo escucha if(listen(fd,5) == -1) { printf("error en listen()\n"); exit(-1); } printf("SERVIDOR EN ESPERA...\n"); longitud_cliente= sizeof(struct sockaddr_in); if ((fd2 = accept(fd,(struct sockaddr *)&client,&longitud_cliente))==-1) { printf("error en accept()\n"); exit(-1); } printf("------SESION INICIADA------\n"); printf("CLIENTE CONECTADO\n"); strcpy(enviar,"SERVIDOR CONECTADO..."); send(fd2, enviar, 1024,0); //Ciclo para enviar y recibir mensajes while(1){ //El servidor espera el primer mensaje recv(fd2,buf,1024,0); if(strcmp(&buf,"salir")==0){ break; } printf("Cliente: %s\n",buf); //El cliente recibe el mensaje del servidor printf("Escribir mensaje: "); scanf("%*c%[^\n]",enviar2); send(fd2,enviar2,1024,0); if(strcmp(enviar2,"salir")==0){ break; } } close(fd2); close(fd); return 0; }
Cliente:
// Ficheros de cabecera #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> int main(int argc, char *argv[]) { //Definir variables,estructuras struct sockaddr_in server; char ip[16]; int fd, numbytes,puerto; char buf[1024]; char enviar[1024]; system("clear"); printf("ingrese la ip del servidor\n"); scanf("%s",ip); printf("ingrese el puerto de conexion\n"); scanf("%d",&puerto); //Socket if ((fd=socket(AF_INET, SOCK_STREAM, 0))==-1){ printf("socket() error\n"); exit(-1); } //Datos del servidor server.sin_family = AF_INET; server.sin_port = htons(puerto); server.sin_addr.s_addr=inet_addr(ip); bzero(&(server.sin_zero),8); //Conectarse al servidor if(connect(fd, (struct sockaddr *)&server, sizeof(struct sockaddr))==-1){ printf("connect() error\n"); exit(-1); } //Recibir mensaje de bienvenida if ((numbytes=recv(fd,buf,1024,0)) == -1){ printf("Error en recv() \n"); exit(-1); } printf("%s\n",buf); //Ciclo para enviar y recibir mensajes while(1){ //El servidor espera el primer mensaje printf("Escribir mensaje: "); scanf("%*c%[^\n]",enviar); send(fd,enviar,1024,0); if(strcmp(enviar,"salir")==0){ break; } //El cliente recibe el mensaje del servidor recv(fd,buf,1024,0); if(strcmp(buf,"salir")==0){ break; } printf("Servidor: %s\n",buf); } close(fd); }
Ejemplo2:
Servidor:
#include<stdio.h> #include<string.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> main(){ int server_sockfd, client_sockfd; // descriptores de sockets int server_len, client_len; //tamaños de las estructuras struct sockaddr_in server_address; //declaracion de estructuras struct sockaddr_in client_address; char c[1024]; //cadena del cliente char ch[1024]; //cadena del servidor int inicio = 0; //determina el inicio de sesion char cs[1024]; //cadena del servidor int bufs; //almacenamiento del tamanio cadena server int ciclo = 1; //variable para ciclo de lectura escritura int puerto; //variable para el puerto system("clear"); printf("La direccion del servidor es 127.0.0.1\n\n"); printf("Por favor introduzca el puerto de escucha: \n\n"); scanf("%d",&puerto); server_sockfd = socket(AF_INET, SOCK_STREAM, 0); // se llena la estructura para el servidor con los datos necesarios server_address.sin_family = AF_INET; server_address.sin_addr.s_addr = inet_addr("127.0.0.1"); server_address.sin_port = puerto; server_len = sizeof(server_address); //avisamos al sistema operativo la creacion del socket bind(server_sockfd, (struct sockaddr *)&server_address, server_len); //decimos al server que quede escuchando listen(server_sockfd,5); printf("SERVIDOR EN ESPERA...\n"); while(ciclo){ //acepta la conexion con el cliente actual client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len); if(inicio ==0){ printf("------SESION INICIADA------\n"); printf("CLIENTE CONECTADO\n"); strcpy(ch,"SERVIDOR CONECTADO..."); send(client_sockfd, ch, 1024,0); inicio = 1; } recv(client_sockfd, cs, 1024,0); printf("El cliente dijo: %s\n",cs); printf("ingrese una cadena: \n"); scanf("%*c%[^\n]",c); send(client_sockfd, c, 1024,0); close(client_sockfd); } close(server_sockfd); }
Cliente:
#include<stdio.h> #include<string.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> main(){ int sockfd; int len; struct sockaddr_in address; int result; char ch[1024]; char c[1024]; int buf; int inicio = 0; char cs[1024]; int bufs; int ciclo =1; char ipserver[10]; int puerto; system("clear"); printf("ingrese la ip del servidor\n"); scanf("%s",ipserver); printf("ingrese el puerto de conexion\n"); scanf("%d",&puerto); while(ciclo){ sockfd = socket(AF_INET, SOCK_STREAM,0); //llenado de la estructura de datos address.sin_family = AF_INET; address.sin_addr.s_addr = inet_addr(ipserver); address.sin_port = puerto; len = sizeof(address); //conectar con el server result = connect(sockfd, (struct sockaddr *)&address, len); if(result ==-1){ perror("ERROR EN LA CONEXION\n"); close(sockfd); } //validar el inicio de sesion if(inicio==0){ printf("--------------- SESION INICIADA --------------\n"); recv(sockfd, ch, 1024,0); printf("%s\n",ch); inicio = 1; } printf("ingrese una cadena para enviar al server: "); scanf("%*c%[^\n]",c); send(sockfd,c, 1024,0); recv(sockfd, ch, 1024,0); printf("El servidor dijo: %s\n",ch); } close(sockfd); }