[C con Clase] Duda con sockets

Matias V. fockewulffw44j en gmail.com
Mar Jun 2 00:53:38 CEST 2009


Hola, estoy empezandoa programar sockets y necesitaria aclarar una duda
sobre la ejecucion de un programa que hace uso de los mismos.

El siguiente es el codigo de un servidor que solamente envia la cadena
"Prueba socket" (es un ejemplo modificado de uno que aparece en la guia
beej):

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

 /*
    ** 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)
    {

    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;



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



        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




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


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

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


    close(sockfd);
    close(new_fd);
    exit(0);
    return 0;
    }

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


El programa se compila y funciona sin problemas.Lo que no entiendo es como
se va ejecuntando el codigo. Hasta donde entiendo primero se crea un socket
usando la función socket() , luego se asocia dicho socket a un puerto y una
dirección usando bind(), y luego se ejecuta la función listen() que le
indica al S.O. que se quede fijando si hay conexiones entrantes.Es decir
(esta sería la duda) que cuando se ejecuta listen() ¿el programa detiene su
ejecución en ese punto y se queda "esperando" un pedido de conexión, y
continua ejecutandose cuando lo recibe?. ¿O es cuando aparece la función
accept que el programa se queda esperando hasta que aparesca una conexión,
es decir "le pregunta" al S.O. si hubo alguna conexión y en caso afirmativo
la acepta o en caso negativo se que esperando hasta que halla alguna ?.
Pregunto esto porque miro el codigo y me parece que si en listen() o
accept() el programa no se detuviera, este llegaria al final y terminaria ya
que en el mismo no hay ningun loop.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20090602/0706e169/attachment.html>


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