#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/un.h>
#define SOCKET_ADDRESS "my_socket"
int main (int argc, char *argv[])
{
pid_t pid = fork();
if (pid < 0)
{
fprintf(stderr, "fork: %s", strerror(errno));
return 1;
}
/**************CLIENT*******************/
if (pid == 0)
{
pid = getpid();
printf("Child process with pid=%d\n", pid);
sleep(1);
int sd = socket(PF_UNIX, SOCK_STREAM, 0);
if(sd == -1)
{
perror("Socket failed");
return 1;
}
struct sockaddr_un address;
address.sun_family = AF_UNIX;
strcpy(address.sun_path, SOCKET_ADDRESS);
if(connect(sd, (struct sockaddr *)&address, sizeof(struct sockaddr_un)) != 0)
{
perror("Connect failed (client)");
close(sd);
return 1;
}
if(write(sd, "Hi", 3) < 0)
{
perror("Write failed");
close(sd);
return 1;
}
close(sd);
return 0;
}
/**************SERVER*******************/
pid = getpid();
printf("Main process with pid=%d\n", pid);
int sd = socket(PF_UNIX, SOCK_STREAM, 0);
if(sd == -1)
{
perror("Socket failed (server)");
return 1;
}
unlink(SOCKET_ADDRESS);
struct sockaddr_un address;
address.sun_family = AF_UNIX;
strcpy(address.sun_path, SOCKET_ADDRESS);
if(bind(sd, (struct sockaddr *)&address, sizeof(struct sockaddr_un)) != 0)
{
perror("Bind failed");
close(sd);
return 1;
}
if(listen(sd, 5) != 0)
{
perror("Listen failed");
close(sd);
return 1;
}
int cd;
socklen_t address_len;
while((cd = accept(sd, (struct sockaddr *) &address, &address_len)) > -1)
{
char *message;
if(read(cd, message, 3) < 0)
{
perror("Read failed");
close(cd);
close(sd);
return 1;
}
printf("%s\n", message);
close(cd);
}
close(sd);
unlink(SOCKET_ADDRESS);
return 0;
}