[C con Clase] Duda con sockets

carlos martinez gadea tupy4 en hotmail.com
Mar Jun 2 12:37:49 CEST 2009


Bueno, ante todo, decirte que tengo este tema muy fresco por la asignatura de sistemas operativos de la carrera. Por lo que espero que te sirva de ayuda.

Como se suele decir, una imagen vale mas que 1000 palabras, asique aqui la tienes, y cualquier duda preguntala, pero creo que queda bastante claro, además, en el pdf que te adjunto, hay una explicación de cada apartado, asique esta todo bastante completo.

Un saludo!

Date: Tue, 2 Jun 2009 00:53:38 +0200
From: fockewulffw44j en gmail.com
To: cconclase en listas.conclase.net
Subject: [C con Clase] Duda con sockets

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.


    

_________________________________________________________________
Llévate Messenger en el móvil a todas partes ¡Conéctate!
http://www.microsoft.com/spain/windowsmobile/messenger/default.mspx
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20090602/f06acb1d/attachment.html>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: Practica Sockets.pdf
Type: application/pdf
Size: 127233 bytes
Desc: no disponible
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20090602/f06acb1d/attachment.pdf>


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