local-socket.c
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void GREEN (char *messg);
void YELLOW (char *messg);
short int loclsckt (char *file);
int main (int argc, char *argv[]) {
char sockfile[] = "/tmp/somesckt", sf2[] = "/tmp/socket2", srvbuf[256], rep[300];
unlink(sf2);
unlink(sockfile);
short int serv = loclsckt(sockfile), client, insock;
pid_t pid = fork();
if ((listen(serv,3)) != 0) {perror("listen fail in main()"); return -3;}
if (pid <0) {perror("fork fail in main()"); return -1;}
else if (pid == 0) {
struct sockaddr_un srvn; size_t size;
struct sockaddr WITH; size_t wsz;
char buffer[4096], messg[256], line[256];
if ((client = loclsckt(sf2)) < 0) exit;
srvn.sun_family = AF_LOCAL;
strcpy(srvn.sun_path, sockfile);
size=SUN_LEN(&srvn);
if ((connect(client,(struct sockaddr*)&srvn,size)) != 0) {
perror("connect fail in main()");
unlink(sf2); exit -2;}
YELLOW("Child connected...");
recv(client,&buffer,4095,0);
sprintf(messg,"client is process %d on fd%d\n", atoi(buffer),client); YELLOW(messg);
YELLOW("Use \"DC\" to disconnect\n");
while (1) {
printf("Client: ");
fgets(line,255,stdin);
send(client,(void*)line,256,0);
sleep(1);
fflush(stdout);
}
} else {
struct sockaddr_un IN;
socklen_t inlen=sizeof(IN);
char messg[64];
fd_set inset;
FD_ZERO(&inset);
FD_SET(serv,&inset);
if ((select(FD_SETSIZE,&inset,NULL,NULL,NULL)) > 0) {
GREEN("Accept(Y)?");
if (getchar() == 'N') { puts("goodbye!"); return -5; }
} else perror("select fail in main()");
if ((insock=accept(serv,(struct sockaddr*)&IN,&inlen)) < 0)
{perror("accept fail in main()"); return -4;}
sprintf(messg,"%d",pid);
send(insock,(void*)messg,6,0);
}
while (1) {
recv(insock,srvbuf,255,0);
if ((strlen(srvbuf)) < 1) continue;
if ((strncmp(srvbuf,"DC",2)) == 0) {kill(pid,9);break;}
sprintf(rep, "Server/parent process recieved: %s",srvbuf);GREEN(rep);
}
close(client);
unlink(sf2);
close(serv);
unlink(sockfile);
return 0;
}
void GREEN (char *messg) {
system("echo -en \"\033[1;32m\"");
printf(messg);
system("echo -en \"\033[1;00m\"");
}
void YELLOW (char *messg) {
system("echo -en \"\033[1;33m\"");
printf(messg);
system("echo -en \"\033[1;00m\"");
}
short int loclsckt (char *file) {
struct sockaddr_un name;
short int sock;
size_t size;
if ((strlen(file)) > 107) {puts("loclsckt(): filename too long"); return -2;}
if ((sock=socket(PF_LOCAL,SOCK_STREAM,0)) < 0) {
perror("socket fail in loclsckt()"); return -1;}
name.sun_family = AF_LOCAL;
strcpy(name.sun_path, file);
size=SUN_LEN(&name);
if ((bind(sock,(struct sockaddr*)&name,size) < 0)) {
perror("bind fail in loclsckt()"); return -3;}
return sock;
}