Ayuda con Socket en C

A ver si te he entendido bien. Para volcarlo a un fichero abierto, podrías usar algo así:

char * ptr = inet_ntoa (client.sin_addr);
write (fd, ptr, strlen (ptr));


Siempre que no se sobreescriba ese buffer. Si no, haz una copia:

char * ptr = strdup (inet_ntoa (client.sin_addr));
write (fd, ptr, strlen (ptr));
free (ptr); // Liberar la copia


Un saludo.
Spoek pues de ninguna de las dos formas funciona, se queda el fichero en blanco y no se escribe nada en el.
Lo he probado y funciona. Aquí está el código modificado:

#include <stdio.h>         
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

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

main()
{

   int fd, fd2, fd3; /* los ficheros descriptores */
   char *ptr;

   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) );
     
      if ((fd3 = open ("id.txt", O_RDWR | O_CREAT)) == -1)
      {
         perror("open");
         exit (-1);
      }
      ptr = strdup (inet_ntoa (client.sin_addr));
      write (fd3, ptr, strlen (ptr));
      free (ptr);
      close (fd3);


      close(fd2); /* cierra fd2 */
   }
}
Thank's tio al final lo hize mas sencillo con un fprintf [toctoc] , ahora necesito un ejemplo servidor-cliente para mandar un fichero del server al cliente.
4 respuestas