Sockets en C (Parte II) – Linux

| 2013-10-17 | No hay comentarios »

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);

}

Acerca del autor: Rodrigo Paszniuk

Ingeniero Informático, amante de la tecnología, la música, el ciclismo y aprender cosas nuevas.

Posts Relacionados

  • Developers SO Sistemas Operativos preferidos por los developers
  • Instalar Tomcat 7 en CentOS 6
  • RPC (Remote Procedure Call) en C – Linux
  • Sockets en C (Parte I) – Linux