[C con Clase] problema con sockets

Jose Alvaro Dominguez ilgrim en gmail.com
Jue Ene 31 09:03:01 CET 2008


¿y las cabeceras?¿se han ido a por tabaco?

2008/1/30, nree <p_westermani en hotmail.com>:
>
> Hola gente!!!
>
> trabajo con eclipse en un ubuntu y estoy haciendo un programilla con
> sockets. Para empezar lo de siempre, un servidor concurrente y un cliente
> que pide peticiones. Mi problema viene al crear los procesos hijos, se
> supone que envian al cliente un saludo y listo, pero... me tira el perror al
> hacer el send y despues de un rato lo hace. Es decir, me explico, el
> servidor se queda un rato con "bad file descriptor" y despues aparece en el
> cliente el mensaje. Y ademas la concurrencia no funciona.
>
> Os dejo los codigos...
>
> servidor.cpp
>
> int main(void) {
>
>         int sock;
>         int sock_dialog;
>         struct sockaddr_in dir_ser;
>         struct sockaddr_in dir_cli;
>         int numbytes;// numbytes2;
>         int yes=1;// conectado=0;
>         socklen_t len;
>         char buf[TAMBUF];
>         //char buf2[TAMBUF];
>
>
>         sock = socket(PF_INET, SOCK_STREAM,0);
>         if (sock < 0)
>         {
>                 perror("error de creación de socket");
>                 //exit(1);
>         }
>         else
>         {
>                 puts("socket creado...");
>         }
>
>         dir_ser.sin_family = PF_INET;
>         dir_ser.sin_addr.s_addr = htonl (INADDR_ANY);
>         dir_ser.sin_port = htons (PORT);
>         memset(dir_ser.sin_zero, '\0', sizeof dir_ser.sin_zero);
>
>         if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) ==
> -1)
>         {
>                 perror("setsockopt");
>                 //exit(1);
>         }
>
>         if (bind(sock, (struct sockaddr *)&dir_ser,sizeof dir_ser)< 0)
>         {
>                 perror("error en la asignación de dirección");
>                 //exit(1);
>         }
>         else
>         {
>                 puts("asignando direccion...");
>         }
>
>         if (listen (sock, NUM_CON) < 0)
>         {
>                 perror("error en la escucha");
>                 //exit(1);
>         }else
>                 puts("socket a la escucha...");
>
>         while(1)
>         {
>                 len = sizeof dir_ser;
>                 sock_dialog = accept(sock, (struct sockaddr *) &dir_cli,
> &len);
>                 if (!fork())
>                 {
>                         shutdown(sock,2);
>                         strcpy(buf, "respuesta desde servidor...");
>                         numbytes = send (sock_dialog, buf, sizeof(buf),
> 0);
>                         if (numbytes < 0)
>                         {
>                                 perror("error en la transmision de
> datos...");
>                         }
>                         //tramitarChat((struct sockaddr_in *)sock_dialog);
>                 }
>                 shutdown(sock_dialog,2);
>         }
> }
>
> cliente.cpp
>
> int main (int argc, char *argv[])
> {
>         int sock, i;
>         struct sockaddr_in dir_serv;
>         char buf[TAMBUF];
>
>         sock = socket (PF_INET, SOCK_STREAM, 0);
>         if (sock < 0)
>         {
>                 perror("No se ha podido crear el socket");
>                 exit (-1);
>         }else
>                 puts ("socket creado...");
>
>         dir_serv.sin_family = PF_INET;
>         dir_serv.sin_port = htons (PORT);
>         inet_aton(argv[1], &(dir_serv.sin_addr));
>         memset(dir_serv.sin_zero, '\0', sizeof dir_serv.sin_zero);
>
>         if (connect (sock, (struct sockaddr*)&dir_serv, sizeof dir_serv)
> <0)
>         {
>                 perror("conexión no aceptada");
>                 exit(-1);
>         }else
>                 puts("conectando con el servidor...");
>
>         i = recv (sock, buf, sizeof(buf),0);
>         puts(buf);
>         shutdown(sock,2);
> }
>
> gracias por vuestra colaboracion
>
> nere
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20080131/b1b89719/attachment.html>


Más información sobre la lista de distribución Cconclase