Hola, estoy empezandoa programar sockets y necesitaria aclarar una duda sobre la ejecucion de un programa que hace uso de los mismos.<br><br>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):<br>
<br>..................................................................................................................................................................................................................................<br>
<br> /*<br>    ** server.c -- Ejemplo de servidor de sockets de flujo<br>    */<br><br>    #include <stdio.h><br>    #include <stdlib.h><br>   /* #include <unistd.h>*/<br>    #include <errno.h><br>
    #include <string.h><br>    #include <sys/types.h><br>    #include <sys/socket.h><br>    #include <netinet/in.h><br><br>    #define MYPORT 5500    // Puerto al que conectarán los usuarios<br><br>
    #define BACKLOG 10     // Cuántas conexiones pendientes se mantienen en cola<br><br><br>    int main(void)<br>    {<br> <br>    int sockfd, new_fd;  // Escuchar sobre sock_fd, nuevas conexiones sobre new_fd<br>        struct sockaddr_in my_addr;    // información sobre mi dirección<br>
        struct sockaddr_in their_addr; // información sobre la dirección del cliente<br>        int sin_size;<br><br>        int yes=1;<br><br><br><br>    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {<br>            perror("socket");<br>
            exit(1);<br>        }<br><br><br><br>        if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) {<br>            perror("setsockopt");<br>            exit(1);<br>        }<br>
        <br>        my_addr.sin_family = AF_INET;         // Ordenación de bytes de la máquina<br>        my_addr.sin_port = htons(MYPORT);     // short, Ordenación de bytes de la red<br>        my_addr.sin_addr.s_addr = INADDR_ANY; // Rellenar con mi dirección IP<br>
        memset(&(my_addr.sin_zero), '\0', 8); // Poner a cero el resto de la estructura<br><br>        <br><br><br>    if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))<br>                                                                       == -1) {<br>
            perror("bind");<br>            exit(1);<br>        }<br><br><br>    if (listen(sockfd, BACKLOG) == -1) {<br>            perror("listen");<br>            exit(1);<br>        }<br><br>   sin_size = sizeof(struct sockaddr_in);<br>
      <br><br>    if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1) <br>                perror("accept");<br>    <br>         <br>        printf("server: got connection from %s\n",inet_ntoa(their_addr.sin_addr));<br>
<br>                <br>    if (send(new_fd, "Prueba socket\n", 14, 0) == -1)<br>        perror("send");<br>                <br><br>    close(sockfd);    <br>    close(new_fd);  <br>    exit(0);<br>    return 0;<br>
    } <br><br>..................................................................................................................................................................................................................................<br>
<br><br>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.<br>
<br>    <br>