[C con Clase] duda con printf y sockets

Matias V. fockewulffw44j en gmail.com
Lun Jun 1 07:28:16 CEST 2009


Hola

Ante todo aclaro que el S.O. que uso es Ubuntu y el compilador es gcc.

Estoy comenzando a programar sockets y me encontre con la siguiente duda:

Tengo el siguiente codigo fuente que actua como un servidor que no hace otra
cosa mas que enviar la cadena de caracteres " Prueba socket" (este codigo
fuente es un ejemplo modificado de uno que aparece en la guia guia beej de
programacion de redes). Notese que en el mismo aparecen algunos printf del
tipo printf("f1"), printf("f2"), etc.

.............................................................................................................................................................................................................................


/*
    ** server.c -- Ejemplo de servidor de sockets de flujo
*/

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <errno.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>

    #define MYPORT 5500    // Puerto al que conectarán los usuarios

    #define BACKLOG 10     // Cuántas conexiones pendientes se mantienen en
cola


    int main(void)
    {
        printf("f1");

    int sockfd, new_fd;  // Escuchar sobre sock_fd, nuevas conexiones sobre
new_fd
    struct sockaddr_in my_addr;    // información sobre mi dirección
    struct sockaddr_in their_addr; // información sobre la dirección del
cliente
    int sin_size;

    int yes=1;

   printf("f2");

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

    printf("f3");

    if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) {
           perror("setsockopt");
           exit(1);
    }

    my_addr.sin_family = AF_INET;         // Ordenación de bytes de la
máquina
    my_addr.sin_port = htons(MYPORT);     // short, Ordenación de bytes de
la red
    my_addr.sin_addr.s_addr = INADDR_ANY; // Rellenar con mi dirección IP
    memset(&(my_addr.sin_zero), '\0', 8); // Poner a cero el resto de la
estructura


    printf("f4");

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

   printf("f5");

    if (listen(sockfd, BACKLOG) == -1) {
            perror("listen");
            exit(1);
    }

    printf("f6");

   sin_size = sizeof(struct sockaddr_in);


    if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size))
== -1)
             perror("accept");


    printf("server: got connection from
%s\n",inet_ntoa(their_addr.sin_addr));


    if (send(new_fd, "Prueba socket\n", 14, 0) == -1)
        perror("send");



    printf("f7");

    close(sockfd);
    close(new_fd);

     exit(0);

     return 0;


}
.............................................................................................................................................................................................................................

El tema es el siguiente, el codigo fuente anterior se compila sin problemas,
pero cuando lo ejecuto ocurre lo siguiente:

En la consola donde lo ejecuto no aparece ningun mensaje, es decir no
aparece ninguno de los printf del tipo printf("f1"). Solo cuando ejecuto el
cliente o bien empleo telnet para conecterme al servidor en cuestion
aparecen en la consola dichos mensajes. Para ser mas claro supongamos que el
programa se llama servidor, entonces abro una terminal y ejecuto dicho
programa, ocurre lo siguiente:

$ ./servidor (ejecuto el programa)
                   (el cursor se queda titilando en esta linea y no aparece
ningun texto)

Ahora abro otra terminal y ejecuto telnet o cualquier otro cliente para
conectarme con el servidor y obtengo la cadena enviada por el programa
servidor sin problemas.

La ventana donde ejecute el programa servidor pasa a quedar asi:

$ ./servidor
f1f2f3f4f5f6server: got connection from 190.190.9.104
f7 $


Es decir aparece todo el texto.

Lo que necesitaria conocer es alguna explicación tecnica de porque el texto
de los printf no va apareciciendo a medida que se ejecuta el programa.


Saludos.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20090601/1b9ba88f/attachment.html>


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