[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