[ Foro de C ]

programación de sockets

10-Aug-2015 21:00
Invitado (Juan María galindio)
2 Respuestas

 


#include <stdio.h>
#include <netdb.h>   /* gethostbyname() necesita esta cabecera */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

  
int main(int argc, char *argv[])
{ 

   struct hostent *he;

   if (argc!=2) {
      printf("Uso: %s <hostname>\n",argv[0]);
      exit(-1);
   }

   if ((he=gethostbyname(argv[1]))==NULL) {
      printf("error de gethostbyname()\n");
      exit(-1);
   }

   printf("Nombre del host: %s\n",he->h_name);  
      /* muestra el nombre del nodo */
   printf("Dirección IP: %s\n",
          inet_ntoa(*((struct in_addr *)he->h_addr)));
      /* muestra la dirección IP */

}


He econtrado esté listado en C, es muy facil, necesito listados como este.


11-Aug-2015 10:58
Invitado (Juan María galindio)

Tengo esté listado pero no lo entiendo, lo baje de una web, alguién me explica el funcionamiento.


/* Estos son los ficheros de cabecera usuales */
#include <stdio.h>          
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT 3550 /* El puerto que será abierto */
#define BACKLOG 2 /* El número de conexiones permitidas */

main()
{

   int fd, fd2; /* los ficheros descriptores */

   struct sockaddr_in server; 
   /* para la información de la dirección del servidor */

   struct sockaddr_in client; 
   /* para la información de la dirección del cliente */

   int sin_size;

   /* A continuación la llamada a socket() */
   if ((fd=socket(AF_INET, SOCK_STREAM, 0)) == -1 ) {  
      printf("error en socket()\n");
      exit(-1);
   }

   server.sin_family = AF_INET;         

   server.sin_port = htons(PORT); 
   /* ¿Recuerdas a htons() de la sección "Conversiones"? =) */

   server.sin_addr.s_addr = INADDR_ANY; 
   /* INADDR_ANY coloca nuestra dirección IP automáticamente */

   bzero(&(server.sin_zero),8); 
   /* escribimos ceros en el reto de la estructura */


   /* A continuación la llamada a bind() */
   if(bind(fd,(struct sockaddr*)&server,
           sizeof(struct sockaddr))==-1) {
      printf("error en bind() \n");
      exit(-1);
   }     

   if(listen(fd,BACKLOG) == -1) {  /* llamada a listen() */
      printf("error en listen()\n");
      exit(-1);
   }

   while(1) {
      sin_size=sizeof(struct sockaddr_in);
      /* A continuación la llamada a accept() */
      if ((fd2 = accept(fd,(struct sockaddr *)&client,
                        &sin_size))==-1) {
         printf("error en accept()\n");
         exit(-1);
      }

      printf("Se obtuvo una conexión desde %s\n",
             inet_ntoa(client.sin_addr) ); 
      /* que mostrará la IP del cliente */

      send(fd2,"Bienvenido a mi servidor.\n",22,0); 
      /* que enviará el mensaje de bienvenida al cliente */

      close(fd2); /* cierra fd2 */
   }
}


 


12-Aug-2015 20:13
Nacho Cabanes (+83)

En primer lugar, no abras un nuevo hilo para cada consulta. Si es continuación de una conversación anterior, es preferible que respondas en la misma conversación.

En segundo lugar, ese fuente está bastante comentado, así que, si tienes nociones básicas, deberías poderlo seguir. Si no es así, ya sabes mi opinión: busca un tutorial de sockets, que te enseñe los conceptos básicos, porque un fuente aislado quizá no sea muy pedagógico. Aun así, C es un lenguaje complejo; puede que un lenguaje más moderno como C#, Java o Python te ayude más a entender los conceptos básicos que intervienen en una comunicación mediante sockets.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)