views:

192

answers:

1

Hi,

I want to make a basic chat application in C using Shared memory. I am working in Linux. The application consist in writing the client and the server can read, and if the server write the client can read the message.

I tried to do this, but I can't achieve the communication between client and server. The code is the following:

Server.c

int
main(int argc, char **argv)
{
 char *msg;
 static char buf[SIZE];
 int n;

 msg = getmem();
 memset(msg, 0, SIZE);
 initmutex();

 while ( true )
 {
  if( (n = read(0, buf, sizeof buf)) > 0 )
  {
   enter();
   sprintf(msg, "%.*s", n, buf);
   printf("Servidor escribe: %s", msg);
   leave();
  }else{
   enter();
   if ( strcmp(buf, msg) )
   {
    printf("Servidor lee: %s", msg);
    strcpy(buf, msg);
   }
   leave();
   sleep(1);
  }
 }
 return 0;
 }

Client.c

int
main(int argc, char **argv)
{
 char *msg;
 static char buf[SIZE-1];
 int n;

 msg = getmem();
 initmutex();

 while(true)
 {
  if ( (n = read(0, buf, sizeof buf)) > 0 )
  {
   enter();
   sprintf(msg, "%.*s", n, buf);
   printf("Cliente escribe: %s", msg);
   leave();
  }else{
   enter();
   if ( strcmp(buf, msg) )
   {
    printf("Cliente lee: %s", msg);
    strcpy(buf, msg);
   }
   leave();
   sleep(1);
  }
 }
 printf("Cliente termina\n");
 return 0;
 }

The shared memory module is the folowing:

#include "common.h"

void
fatal(char *s)
{
 perror(s);
 exit(1);
}

char *
getmem(void)
{
 int fd;
 char *mem;

 if ( (fd = shm_open("/message", O_RDWR|O_CREAT, 0666)) == -1 )
  fatal("sh_open");
 ftruncate(fd, SIZE);
 if ( !(mem = mmap(NULL, SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0)) )
  fatal("mmap");
 close(fd);
 return mem;
}

static sem_t *sd;

void
initmutex(void)
{
 if ( !(sd = sem_open("/mutex", O_RDWR|O_CREAT, 0666, 1)) )
  fatal("sem_open");
}

void
enter(void)
{
 sem_wait(sd);
}

void
leave(void)
{
 sem_post(sd);
}
+3  A: 

By the time you'll have this working right, you'll have re-invented a pipe. A socket is the better solution, that will also cover the more common scenario where the server and the client are not running on the same machine.

Hans Passant