First, thats my first post in this forum so hello everybody

Well, I'm trying to write my first C application. For now I want to do a primitive chat that allows to save the conversations in a txt file.

The chat will be for POSIX systems and it will use AF_INET / SOCK_STREAM sockets (TCP), it code compiles fine with gcc 4.1.1, the problem comes when I run the program, because the server only receives the first message, after that the client runs out.

The code is very simple but Im unable to find the bug, please try to give me a hand.

Regards & Thanks, here is the code:

PD: Yes, I'm spanish

_____________
programilla_commons.h
________________

Code:
#ifndef __PROGRAMILLA_COMMONS__

#define __PROGRAMILLA_COMMONS__
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define ERROR(numerror,errno) { printf("Error: %s // %s \n", errores[numerror-1], strerror (errno)); }
#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 6969
#define MAX 255
#endif

char errores[10][45] = {"1, Apertura del fichero",
                       "2, Escritura del fichero",
                       "3, Cerradura del fichero",
                       "4, Lectura del mensaje en el socket",
                       "5, Escritura del mensaje en el socket",
                       "6, Apertura del socket del server",
                       "7, Publicidad del socket del server",
                       "8, Acceptar la conexion del cliente",
                       "9, Apertura del socket del cliente",
                       "10, Peticion de conexion del cliente"};

const char nombre_txt[20] = "mitxt";
________________
programilla-server.c
________________

Code:
#include "programilla-commons.h"

leer_mensaje (int new_socket_fd, char* mensaje)
{
       int errno;
       int nbytes;

       if (( nbytes = read (new_socket_fd, mensaje, MAX)) == -1)
               ERROR(4,errno);
       printf(mensaje);
}

int main()
{
       int errno;
       int pid;
       int socket_fd, new_socket_fd;
       char *mensaje = (char *) malloc (255);

       struct sockaddr_in server_addr, client_addr;

       int client_addr_length;

       if ((socket_fd = socket (AF_INET, SOCK_STREAM, 0)) == -1)
               ERROR(6,errno);

       server_addr.sin_family = AF_INET;
       server_addr.sin_addr.s_addr = inet_addr (SERVER_IP);
       server_addr.sin_port = htons (SERVER_PORT);

       if ((bind (socket_fd, (struct sockaddr *) &server_addr, sizeof (server_addr))) == -1)
               ERROR(7,errno);

       listen (socket_fd, 5);

       for (;;) {
               client_addr_length = sizeof (client_addr);

               if ((new_socket_fd = accept (socket_fd, (struct sockaddr *) &client_addr, &client_addr_length)) == -1)
                       ERROR(8,errno);

               if ((pid = fork ()) == -1)
               {
                       ERROR(15,errno)
               }
               else if (pid == 0) {
                       close (socket_fd);
                       leer_mensaje (new_socket_fd, mensaje);
                       close (new_socket_fd);
                       exit (0);
               }
                       close (new_socket_fd);
       }


return 0;

}
________________
programilla-cliente.c
________________

Code:
#include "programilla-commons.h"

escribir_mensaje (int* socket_fd, char* mensaje)
{
       int errno;
       int nbytes;

       if ((nbytes = write (*socket_fd, "aaa", MAX)) == -1)
               ERROR(5,errno);
       printf("Enviado!");
}

int main()
{
       int errno;
       bool fin = false;
       FILE *txt;
       int socket_fd;
       char *mensaje = (char *) malloc (255);

       struct sockaddr_in server_addr;

       if ((socket_fd = socket (AF_INET, SOCK_STREAM, 0)) == -1)
               ERROR(9,errno);

       server_addr.sin_family = AF_INET;
       server_addr.sin_addr.s_addr = inet_addr (SERVER_IP);
       server_addr.sin_port = htons (SERVER_PORT);

       if (connect (socket_fd, (struct sockaddr *) &server_addr, sizeof (server_addr)) == -1)
               ERROR(10,errno);

       if ((txt = fopen (nombre_txt, "w")) == NULL)
               ERROR(1,errno);

       printf ("Introduce una linea (END para acabar)\n"); fflush (stdout);
       do {
               fgets (mensaje, MAX, stdin);

               if ((strcmp (mensaje, "END\n")) == 0)
               {
                       fin = true;
                       break;
               }

               if ((fprintf (txt, mensaje)) < 0)
               ERROR(2,errno);

               escribir_mensaje (&socket_fd, mensaje);

       }
       while (fin != true);

       if ((fclose (txt)) != 0)
               ERROR(3,errno);

       close (socket_fd);

return 0;

}