Young India 99

YES-Young Energetic Sincere

Home
Instant Inspiration
Incredible India
Knowledge Transfer(KT)
Placement Puraan
VTU Results
Technical Stuff
Coders Adda
win32 snippets
Windows CE Basics
stock ticker PocketPC
Windows Custom Control
Concatenated SMS
Using Timers in Linux
IPC in Linux
Deadlock Detection Algo
Priority queue spinlocks
Sample Queue C++
Contact Us

 

 IPC in Linux using Sockets and Signals

 

 

Signals

kill(gPid,SIGUSR1);//Server sends the SIGUSR1 signal to the client where gPid is the pid of the client
(void) signal(SIGUSR1, signal_callback);//Client receives the SIGUSR1 signal using signal_callback function

SOCKET

 

There are two types of SOCKETS AF_UNIX and AF_INET.AF_UNIX is used for inter process communication within the same system whereas in AF_INET server and client can be placed in different systems.If we use a loopback address 127.0.0.1 than AF_INET sockets can be used for IPC in the same system.

 

Following are the sample working code which demonstrates the use of sockets(AF_UNIX and AF_INET) for interprocess communication
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
///////////////////////server_unix////////////////
/* a server in the unix domain.  */
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>


#define SERVER_PATH     "/tmp/server9"


void error(char *);
int main(int argc, char *argv[])
{
   int sockfd, newsockfd, servlen, clilen, n;
   struct sockaddr_un  cli_addr, serv_addr;
   char buf[81];

   if ((sockfd = socket(AF_UNIX,SOCK_STREAM,0)) < 0)
       error("creating socket");
   bzero((char *) &serv_addr, sizeof(serv_addr));
   serv_addr.sun_family = AF_UNIX;
   strcpy(serv_addr.sun_path, SERVER_PATH);
   servlen=strlen(serv_addr.sun_path) +
                     sizeof(serv_addr.sun_family);
   if(bind(sockfd,(struct sockaddr *)&serv_addr,SUN_LEN(&serv_addr)/*servlen*/)<0)
       error("binding socket");

   listen(sockfd,5);
   clilen = sizeof(cli_addr);
   newsockfd = accept(
        sockfd,(struct sockaddr *)&cli_addr,&clilen);
   if (newsockfd < 0)
        error("accepting");
   n=read(newsockfd,buf,80);
   printf("Message from client:%s\n",buf);
   printf("Enter your message: ");
   bzero(buf,80);
   fgets(buf,80,stdin);
   write(newsockfd,buf,strlen(buf));
   unlink( SERVER_PATH );
}

void error(char *msg)
{
    perror(msg);
    exit(0);
}
///////////////////////////////////////////////////

//////////////////////client_UNIX////////////////
/* a client in the unix domain */
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
void error(char *);


#define SERVER_PATH     "/tmp/server9"

void main(int argc, char *argv[])
{
   int sockfd, servlen,n;
   struct sockaddr_un  serv_addr;
   char buffer[81];

   bzero((char *)&serv_addr,sizeof(serv_addr));
   serv_addr.sun_family = AF_UNIX;
   strcpy(serv_addr.sun_path, SERVER_PATH);
   servlen = strlen(serv_addr.sun_path) +
                 sizeof(serv_addr.sun_family);
   if ((sockfd = socket(AF_UNIX, SOCK_STREAM,0)) < 0)
       error("Creating socket");
   if (connect(sockfd, (struct sockaddr *)
                         &serv_addr, servlen) < 0)
       error("Connecting");
   printf("Enter your message: ");
   bzero(buffer,80);
   fgets(buffer,80,stdin);
   write(sockfd,buffer,strlen(buffer));
   bzero(buffer,80);
   n=read(sockfd,buffer,80);
   printf("Message from server:%s\n",buffer);
  
   unlink( SERVER_PATH );
}

void error(char *msg)
{
    perror(msg);
    exit(0);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////server_inet/////////////////
/* server  inet domain*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT_NO 8999

void error(char *msg)
{
    perror(msg);
    exit(1);
}

int main()
{
     int sockfd, newsockfd, portno, clilen;
     char buffer[256];
     struct sockaddr_in serv_addr, cli_addr;
     int n;
  
     sockfd = socket(AF_INET, SOCK_STREAM, 0);
     if (sockfd < 0)
        error("ERROR opening socket");
     bzero((char *) &serv_addr, sizeof(serv_addr));
     portno = PORT_NO;
     serv_addr.sin_family = AF_INET;
     serv_addr.sin_addr.s_addr = INADDR_ANY;
     serv_addr.sin_port = htons(portno);
     if (bind(sockfd, (struct sockaddr *) &serv_addr,
              sizeof(serv_addr)) < 0)
              error("ERROR on binding");
     listen(sockfd,5);
     clilen = sizeof(cli_addr);
     newsockfd = accept(sockfd,
                 (struct sockaddr *) &cli_addr,
                 &clilen);
     if (newsockfd < 0)
          error("ERROR on accept");
     bzero(buffer,256);
     n = read(newsockfd,buffer,255);
     if (n < 0) error("ERROR reading from socket");
     printf("Here is the message: %s\n",buffer);
     n = write(newsockfd,"Server recieved the message",18);
     if (n < 0) error("ERROR writing to socket");
     return 0;
}
/////////////////////////////////////////////////////

/////////////////////////client_inet////////////////////
/* client in inet domain*/



#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

#define HOST_NAME "127.0.0.1"
#define PORT_NO 8999

void error(char *msg)
{
    perror(msg);
    exit(0);
}

int main()
{
    int sockfd, portno, n;
    struct sockaddr_in serv_addr;
    struct hostent *server;
    char buffer[256] = {0};
   
    portno = PORT_NO;
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0)
        error("ERROR opening socket");
    server = gethostbyname(HOST_NAME);
    if (server == NULL) {
        fprintf(stderr,"ERROR, no such host\n");
        exit(0);
    }
    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr,
         (char *)&serv_addr.sin_addr.s_addr,
         server->h_length);
    serv_addr.sin_port = htons(portno);
    if (connect(sockfd,&serv_addr,sizeof(serv_addr)) < 0)
        error("ERROR connecting");
    printf("Enter the message: ");
    bzero(buffer,256);
    fgets(buffer,255,stdin);
    n = write(sockfd,buffer,strlen(buffer));
    if (n < 0)
         error("ERROR writing to socket");
    bzero(buffer,256);
    n = read(sockfd,buffer,255);
    if (n < 0)
         error("ERROR reading from socket");
    printf("%s\n",buffer);
    return 0;
}

////////////////////////////////////////////////////////

 

 

 

 

Comments

 

* First name (required):

* Last name (required):
* E-mail address (required):

Phone number:
* Message (required):