rzmul2@tuvie (Uni Leoben) (01/10/88)
Problem with socket based IPC on Apollo DN3000
Hi everybody,
I'm posting this for a friend who has no Usenet connection (yet) :
The following little piece of code should demonstrate interprocess
communication between a server running as a background process
and a client which can be run as a program from the user's console.
It's taken from Maurice Bach, "The Design of the UNIX Operating System",
ISBN 0-13-201799-7 025,Prentice Hall, while the syserr() function
is from Rochkind, "Advanced Unix Programming".
The problem is that the example does not run on my DN3000
Domain/IX SR9.6-BSD4.2. Can anyone run it on his/her machine and tell me
if it's running there and what probably could be wrong. I'd appreciate
any replies via e-mail.
-- Tom Leitner (rzmul2@tuvie.uucp)
Here comes the code:
-----snip-----snip-----snip-----snip-----snip-----snip-----snip-----snip------
# To recover, type sh archive
echo restoring Makefile
sed 's/^X//' > Makefile <<\XxXxXxXxXx-EOF-XxXxXxXxXx
Xall: server client testit
Xserver: server.o syserr.o
X cc -o server server.o syserr.o
Xclient: client.o syserr.o
X cc -o client client.o syserr.o
Xtestit: server client
X server & client
XxXxXxXxXx-EOF-XxXxXxXxXx
echo restoring server.c
sed 's/^X//' > server.c <<\XxXxXxXxXx-EOF-XxXxXxXxXx
X#include <sys/types.h>
X#include <sys/socket.h>
X#include <netinet/in.h>
X
Xmain()
X{
X int sd,ns;
X char buf[256];
X struct sockaddr sockaddr;
X int pid,n;
X int fromlen = sizeof (sockaddr);
X
X pid = getpid();
X
X sd = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
X /* returns an i/o error already !!! ???? Why?
X I tried different combinations */
X if(sd == -1)
X syserr("socket");
X
X /* bind name - don't include null char in the name */
X
X if(bind(sd,"sockname",sizeof("sockname")-1)== -1)
X syserr("bind");
X if(listen(sd,1)==-1)
X syserr("listen");
X
X for(;;)
X {
X
X ns = accept(sd,&sockaddr,&fromlen); /* accept should wait,
X on my DN3000 it does an i/o error
X instead */
X if(ns == -1)
X syserr("accept");
X
X if(fork() == 0)
X {
X /* child */
X close (sd);
X n=read(ns,buf,sizeof(buf));
X printf("(%d) server read %d '%s'\n",pid,n,buf);
X exit();
X }
X close(ns);
X }
X}
X
XxXxXxXxXx-EOF-XxXxXxXxXx
echo restoring client.c
sed 's/^X//' > client.c <<\XxXxXxXxXx-EOF-XxXxXxXxXx
X#include <sys/types.h>
X#include <sys/socket.h>
X
Xmain()
X{
X int sd,ns;
X char buf[256];
X struct sockaddr sockaddr;
X int fromlen;
X
X sd = socket(AF_UNIX,SOCK_STREAM,0);
X
X /* connect to name - null char is not part of name */
X if(connect(sd,"sockname",sizeof("sockname") -1) == -1)
X exit();
X
X write(sd,"hi guy",6);
X}
XxXxXxXxXx-EOF-XxXxXxXxXx
echo restoring syserr.c
sed 's/^X//' > syserr.c <<\XxXxXxXxXx-EOF-XxXxXxXxXx
X#include <stdio.h>
Xvoid
Xsyserr(msg)
Xchar *msg;
X{
X extern int errno,sys_nerr;
X extern char *sys_errlist[];
X
X fprintf(stderr,"ERROR: %s (%d",msg,errno);
X if (errno >0 && errno < sys_nerr)
X fprintf(stderr,";%s)\n",sys_errlist[errno]);
X else
X fprintf(stderr,")\n");
X exit(1);
X}
X
Xvoid
Xfatal(msg) /* print error message and terminate */
Xchar *msg;
X{
X fprintf(stderr,"ERROR: %s\n",msg);
X exit(1);
X}
XxXxXxXxXx-EOF-XxXxXxXxXx
exit 0
-----snip-----snip-----snip-----snip-----snip-----snip-----snip-----snip------benoni@ssc-vax.UUCP (Charles L Ditzel) (01/12/88)
In article <552@tuvie>, rzmul2@tuvie (Uni Leoben) writes: > Problem with socket based IPC on Apollo DN3000 > Hi everybody, > I'm posting this for a friend who has no Usenet connection (yet) : ... > The problem is that the example does not run on my DN3000 ... > #include <sys/types.h> > #include <sys/socket.h> > #include <netinet/in.h> > > main() > { > int sd,ns; .... > > pid = getpid(); > sd = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); > /* returns an i/o error already !!! ???? Why? > I tried different combinations */ .... Yes, I too had problems with sockets on a dn3000, I didn't have time to solve the problem (get the uw server running) and I never got back to it (the real world interfered). My dn3000 was running (sr9.6) bsd4.2. The code I was compiling had previously compiled with no problems on a BSD4.3 VAX 11/780. Now that you remind me, I would like to get back to trying to get uw on the Apollo...but it on hinges figuring out why it dies in the same place.