elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Ingresar Registrarse
07 Septiembre 2008, 02:43  



+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderador: ®®)
| | |-+  Duda con "chat" en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Imprimir
Autor Tema: Duda con "chat" en C  (Leído 203 veces)
Leber

Desconectado Desconectado

Mensajes: 249

"Las estrellas se apagan..."


Ver Perfil
Duda con "chat" en C
« en: 23 Junio 2008, 00:08 »

Bueno, no es bien bien en un chat, hablando claro y simplificando, es solo una aplicacion de servidor<->cliente, los cuales pueden enviarse datos sin esperar a recibir ni a leer de teclado(Para ello tuve que usar los flags de no bloqueante para los descriptores, tanto del socket como de la entrada standart(teclado). El modo en que lo he hecho es algo extraño, y no creo que sea el mas adecuado, ya que si no ocurre nada, el bucle se ejecuta muchisimas veces y no se hasta que punto es bueno eso, pero bien, les muestro el codigo de servidor.c y cliente.c y a ver si me echan un cable.

Servidor.c

Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#include <fcntl.h>

#define PORT 3222
#define MAX 100

int
main(int argc, char **argv)
{

  struct sockaddr_in servidor,cliente;
  int fd,fd2,sin_size,nbytes,flags;
  char buffer[MAX],buf[MAX];
 
         if((fd=socket(AF_INET,SOCK_STREAM,0))==-1)
           {
     perror("socket->");
             exit(-1);
           }

 

servidor.sin_family=AF_INET;
         servidor.sin_port=htons(PORT);
         servidor.sin_addr.s_addr=INADDR_ANY;
         memset(&(servidor.sin_zero),' ',8);

                if((bind(fd,(struct sockaddr *)&servidor,sizeof(struct sockaddr)))==-1)
  {
                    perror("bind");
                    exit(-1);
                  }

if((listen(fd,2))==-1)
                  {
                    perror("listen");
                    exit(-1);
                  }

       
       sin_size=sizeof(struct sockaddr_in);

if((fd2=accept(fd,(struct sockaddr *)&cliente,&sin_size))==-1)
      {
                        perror("accept");
                        exit(-1);
                      }

             if(flags=fcntl(fd2,F_GETFL,0)==-1)
                 {
                    perror("cuidado!");
                    exit(-1);
                 }

          flags |=O_NONBLOCK;

             if(fcntl(fd2,F_SETFL,flags)==-1)
                {
                   perror("2flags");
                   exit(-1);
                }


            if(flags=fcntl(0,F_GETFL,0)==-1)
                 {
                    perror("cuidado!");
                    exit(-1);
                 }

          flags |=O_NONBLOCK;

             if(fcntl(0,F_SETFL,flags)==-1)
                {
                   perror("2flags");
                   exit(-1);
                }             

    printf("Cliente conectado: %s\n",inet_ntoa(cliente.sin_addr));

    while(1)
                     {
             if((nbytes=recv(fd2,buffer,100,0))>0)
                         {
           buffer[nbytes]=0;
                           printf("Buffer->%s",buffer);
                         }
       //printf("Server enmedio\n");
                       memset(buffer,sizeof(buffer),0);
                       if((nbytes=read(0,buffer,MAX-1))>0)
                         {
                          buffer[nbytes]=0;
                          send(fd2,buffer,nbytes,0);
                         }
                     }    
                         
                         
                                       
                     
                   

    close(fd2);
 
close(fd);
}


Cliente.c

Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <fcntl.h>

#define PORT 3222
#define MAX 100
int
main(int argc, char **argv)
{

  struct hostent *server_info;
  struct sockaddr_in server;
  int fd,numbytes,flags;
  char buf[200];

         if((server_info=gethostbyname(argv[1]))==NULL)
          {
            perror("gethost");
            exit(-1);
          }

if((fd=socket(AF_INET,SOCK_STREAM,0))==-1)
   {
             perror("socket");
             exit(-1);
           }

                                                                                   
                                                                         


server.sin_family=AF_INET;
         server.sin_port=htons(PORT);
         server.sin_addr=*((struct in_addr *)server_info->h_addr);
         memset(&(server.sin_zero),' ',8);

         if((connect(fd,(struct sockaddr *)&server,sizeof(struct sockaddr)))==-1)
   {
             perror("socket");
             exit(-1);
           }

                             
if(flags=fcntl(fd,F_GETFL,0)==-1)
           {
             perror("cuidado!");
             exit(-1);
           }

         flags |=O_NONBLOCK;

         if(fcntl(fd,F_SETFL,flags)==-1)
           {
             perror("2flags");
             exit(-1);
           }
                                               

if(flags=fcntl(0,F_GETFL,0)==-1)
           {
             perror("cuidado!");
             exit(-1);
           }

         flags |=O_NONBLOCK;

         if(fcntl(0,F_SETFL,flags)==-1)
           {
             perror("2flags");
             exit(-1);
           }
                 

                                                         

 


        while(1)
          {
            if((numbytes=read(0,buf,8))>0)
      {
printf("Leyendo del teclado\n");
                 buf[numbytes]=0;
                 send(fd,buf,numbytes,0);
                 memset(buf,sizeof(buf)-1,0);
              }
   
            if((recv(fd,buf,20,0))>0)
      {
printf("Recibiendo!\n");
                 buf[strlen(buf)-1]=0;
                 printf("Buffer->%s\n",buf);
      }         
          }

         close(fd);

return 0;

}

Hasta aqui todo, gracias de antemano

En línea

"Solo los tontos carecen de preucupaciones." Johann Wolfgang Goethe
Ferсhu

Desconectado Desconectado

Mensajes: 1.225

Menos palabras y Mas codigos.


Ver Perfil WWW
Re: Duda con "chat" en C
« Respuesta #1 en: 23 Junio 2008, 00:11 »

Y cual es la duda?  :huh:
En línea

Leber

Desconectado Desconectado

Mensajes: 249

"Las estrellas se apagan..."


Ver Perfil
Re: Duda con "chat" en C
« Respuesta #2 en: 23 Junio 2008, 13:58 »

No hay duda como tal, la "aplicacion" esta hecha ya, lo unico que queria saber, es si existe otro modo de podeer leer/escribir sin tener que esperar a recibir/leer de teclado sin bloquear los sockets, ya que tal como esta, se bloquean 2 descriptores, el del socket, y el de entrada standart para que pueda leerse/escribir sin aguardar a nada, pero claro, sino ocurre nada, al estar en un bucle infinito se ejecuta muchisimas veces, y mi duda era si hay un modo menos "chapucero" de hacerlo.

Gracias de antemano
En línea

"Solo los tontos carecen de preucupaciones." Johann Wolfgang Goethe
Páginas: [1] Ir Arriba Imprimir 
Ir a:  







Consolas     La Web de Goku     MilW0rm     MundoDivx

Hispabyte     Truzone     TodoReviews     ZonaPhotoshop

hard-h2o modding    Foros de ayuda    Yashira.org    Videojuegos    indetectables.net   

Noticias Informatica    Seguridad Informática    ADSL    Foros en español    eNYe Sec

Todas las webs afiliadas están libres de publicidad engañosa.

Powered by SMF 1.1.5 | SMF © 2006-2008, Simple Machines LLC