Inter Process Communication, how does it work?
Ephrem Chemaly
ephrem at oakhill.UUCP
Fri Jul 27 05:56:47 AEST 1990
I have two X applications, I would like to send some data from one to the
other. The two applications do not necessarily reside on the same CPU.
Here is the code I wrote to try this, and it does not work. I have included
the two files here. The first "ipc.c" is the server program, that listens
to inputs, and the second "client.c" is the client program that will send the
data. I start the server program, then I start the client program and nothing
happens. In the file /etc/servers I have added the line:
tsteph tcp /usr/users/ephrem/source/misc/ipc/ipc
so when I start the client program, If the server program is not already
running, the client will start it. Even though the server gets started,
it still does not get the input from the client. I need to send data both
ways also.
I am trying this on Sun and on A/UX.
/******************************************************************************
*
* ipc.c
*
* This file contains the server communication routines.
*
******************************************************************************/
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h> /* For sockaddr_in. */
#include <netdb.h>
/******************************************************************************
********** doit(): . *******
******************************************************************************/
int doit(g, from)
int g;
struct sockaddr_in *from;
{
char buf[256];
printf("Doing it\n");
read(g, buf, sizeof(buf));
}
/******************************************************************************
********** main(): . *******
******************************************************************************/
main(argc, argv, envp)
int argc;
char **argv, **envp;
{
struct servent *sp;
int s, ret;
if ( (sp=getservbyname("tsteph", "tcp")) == 0 )
{
perror("getservbyname");
exit(1);
}
sp->s_aliases = 0;
if ( (s=socket(AF_INET, SOCK_STREAM, 0)) < 0 )
{
perror("socket");
exit(2);
}
if ( (ret=bind(s, (caddr_t)sp, sizeof(struct servent) )) < 0 )
{
perror("bind");
exit(3);
}
if ( (ret=listen(s, 5)) < 0 )
{
perror("listen");
exit(4);
}
for ( ; ; )
{
struct sockaddr_in from;
int g, len = sizeof(from);
printf("Waiting for connection:\n");
if ( (g=accept(s, &from, &len)) < 0 )
{
perror("accept");
continue;
}
if ( fork()==0 )
{
close(s);
doit(g, &from);
}
close(g);
}
}
/******************************************************************************
*
* client.c
*
* This file contains the (inter process communication) client
* communication routines.
*
******************************************************************************/
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h> /* For sockaddr_in. */
#include <netdb.h>
#include <sys/errno.h>
/******************************************************************************
********** main(): . *******
******************************************************************************/
main(argc, argv, envp)
int argc;
char **argv, **envp;
{
struct sockaddr_in sin;
struct servent *sp;
struct hostent *hp;
int s;
char *hostname, *TheMessage = "A message from the client";
int ret;
if ( (sp=getservbyname("tsteph", "tcp")) == 0 )
{
perror("getservbyname");
exit(1);
}
#ifdef macII
hostname = "unimac";
#else
hostname = "soleil";
#endif
if ( (hp=gethostbyname(hostname)) == 0 )
{
perror("gethostbyname");
exit(2);
}
bzero((char*)&sin, sizeof(sin));
bcopy(hp->h_addr, (char*)&sin.sin_addr, hp->h_length);
sin.sin_family = hp->h_addrtype;
sin.sin_port = sp->s_port;
printf("sin_family = %d\n", sin.sin_family);
printf("sin_port = %d\n", sin.sin_port);
#ifdef macII
printf("sin_addr = %u\n", sin.sin_addr);
#else
printf("sin_addr = %d.%d.%d.%d\n", sin.sin_addr.S_un.S_un_b.s_b1, sin.sin_addr.S_un.S_un_b.s_b2, sin.sin_addr.S_un.S_un_b.s_b3, sin.sin_addr.S_un.S_un_b.s_b4);
#endif
printf("sin_zero = %d,%d,%d,%d,%d,%d,%d,%d\n", sin.sin_zero[0], sin.sin_zero[1], sin.sin_zero[2], sin.sin_zero[3], sin.sin_zero[4], sin.sin_zero[5], sin.sin_zero[6], sin.sin_zero[7]);
if ( (s=socket(AF_INET, SOCK_STREAM, 0)) < 0 )
{
perror("socket");
exit(3);
}
if ( (ret=connect(s, (char*)&sin, sizeof(sin))) < 0)
{
perror("connect");
exit(5);
}
if ( ret = write(s, TheMessage, strlen(TheMessage)) < 0 )
{
perror("write");
exit(4);
}
if ( close(s) )
perror("close");
}
Thanks in advance,
Ephrem A. Chemaly
+=========================================================================+
| Motorola Inc. Ephrem A. Chemaly |
| 6501 William Cannon Drive West |
| Austin, Texas 78735 |
| Maildrop: OE-28 |
| (512) 891-2760 |
| |
| Internal Addr: ephrem at soleil-tx |
| Internet Addr: ...!soleil-tx.sps.mot.com!ephrem |
| UUCP Address: oakhill!soleil-tx!ephrem at cs.utexas.edu |
+=========================================================================+
More information about the Comp.lang.c
mailing list