system@asuvax.UUCP (Marc Lesure) (02/25/86)
Here at Arizona State University we have a class being taught which requires the students to use sockets. The problem we have is that when these users start running their software, our VAX hangs and the only way to recover is to hard crash the VAX. I've looked at the routines the students have written and they seem to follow what the documentation says (I'm not that familiar with the socket software). Is there an error(s) in the documentation? Is there a limit on the number of sockets that can used at any on time? Do sockets prevent dead-locking situations? We are running a VAX 11/780 with 4.2bsd. Thanks, ------------------------------------------------- Marc Lesure System Manager Engineering Computer Center Arizona State University Tempe, Arizona UUCP: ...!{ucbvax,ihnp4}!arizona!asuvax!lesure ...!ihnp4!terak!asuvax!lesure CSNET: lesure@asu ARPA: lesure%asu@csnet-relay
ji@garfield.columbia.edu (John Ioannidis) (02/28/86)
In article <507@asuvax.UUCP>, system@asuvax.UUCP (Marc Lesure) writes: > Here at Arizona State University we have a class being taught which requires > the students to use sockets. The problem we have is that when these users > start running their software, our VAX hangs and the only way to recover is > to hard crash the VAX. I've looked at the routines the students have > written and they seem to follow what the documentation says (I'm not that > familiar with the socket software). > > Is there an error(s) in the documentation? Are you kidding? errors or omissions in the Unix documentation? > Is there a limit on the number of sockets that can used at any on time? There is only that limit of the #of processes trying to connect to a specific socket. (As specified in the listen(2) call) > Do sockets prevent dead-locking situations? Most probably they create dlock's inside the kernel :-) > > We are running a VAX 11/780 with 4.2bsd. > From the description, I understand that the problem is with Unix domain (AF_UNIX) sockets. Two programs that demonstrate the use of unix-domain sockets are the following. Compile the as follows: $ cc und_send.c -o us $ cc und_recv.c -o ur and execute them : $ ur& $ us Then, you'll (hopefully!) get the following output, which comes from ur: Accepted! Lenght:110 Family: 1 Path: yourself Got peer! Lenght:110 Family: 0 Path: Read: Hello, yourself! Of course, like it says in the manual, the peer's family is always 0 and the path doesn't make sense. Sorry that the programs are not very well commented (the code is obvious :-) ) but I just don't have the time to add them right now. So, enjoy: ----------CUT HERE: und_send.c ------------ #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> /* * I included <sys/un.h> here and changed the path length from 109 to 108. * Don't ask me why -- it works this way, but didn't with 109!!! */ /* un.h 6.1 83/07/29 */ /* * Definitions for UNIX IPC domain. */ struct sockaddr_un { short sun_family; /* AF_UNIX */ char sun_path[108]; /* path name (gag) [mod by ji] */ }; #ifdef KERNEL int unp_discard(); #endif main() { int sm; struct sockaddr_un myself; struct sockaddr_un yourself; bzero( &myself, sizeof( myself ) ); bzero( &yourself, sizeof( yourself ) ); myself.sun_family = AF_UNIX; yourself.sun_family = AF_UNIX; strcpy( myself.sun_path, "myself" ); strcpy( yourself.sun_path, "yourself" ); sm = socket( AF_UNIX, SOCK_STREAM, 0, 0 ); if( sm < 0 ) { perror( "und_send: socket" ); exit(1); } unlink( "myself" ); if( bind( sm, &myself, sizeof( myself ) ) < 0 ) { perror( "und_send: bind" ); exit( 1 ); } if( connect( sm, &yourself, sizeof( yourself ) ) < 0 ) { perror( "und_send: connect" ); exit( 1 ); } if( write( sm, "Hello, yourself!", 17 )<0 ) perror( "und_send: write" ); } -------------CUT HERE: und_recv.c ----------- #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> /* un.h 6.1 83/07/29 */ /* * Definitions for UNIX IPC domain. */ struct sockaddr_un { short sun_family; /* AF_UNIX */ char sun_path[108]; /* path name (gag) [mod by ji] */ }; #ifdef KERNEL int unp_discard(); #endif main() { /* Now, I am YOURSELF!!! */ int i, sm, as, rfds, mylen, hislen; char buf[80]; struct sockaddr_un myself; struct sockaddr_un yourself; struct sockaddr_un himself; bzero( &myself, sizeof( myself ) ); bzero( &yourself, sizeof( yourself ) ); bzero( &himself, sizeof( himself ) ); yourself.sun_family = AF_UNIX; strcpy( yourself.sun_path, "yourself" ); sm = socket( AF_UNIX, SOCK_STREAM, 0, 0 ); if( sm < 0 ) { perror( "und_recv: socket" ); exit(1); } unlink( "yourself" ); if( bind( sm, &yourself, sizeof( yourself ) ) < 0 ) { perror( "und_recv: bind" ); exit( 1 ); } if( listen( sm, 5 ) < 0 ) { perror( "und_recv: listen" ); exit( 1 ); } /* * SCREAM OF JOY !!!!!!!!!! * The key to success is the following select statement * I saw that in a program our system administrator had * given me quite some time ago, but which did not otherwise * work like I wanted it to. Also note that the select(2) * call is somewhat changed in 4.3, so beware. */ rfds = 1 << sm; select( 20, &rfds, 0, 0, 0 ); mylen = sizeof( myself ); if( ( as=accept( sm, &myself, &mylen )) < 0 ) { perror( "und_recv: accept" ); exit( 1 ); } printf( "Accepted!\n\tLenght:%d\n\tFamily: %d\n\tPath: %s\n\n", mylen, myself.sun_family, myself.sun_path ); hislen = sizeof( himself ); getpeername( as, &himself, &hislen ); printf( "Got peer!\n\tLenght:%d\n\tFamily: %d\n\tPath: ", hislen, himself.sun_family ); for( i=0; i<hislen; i++ ) putchar( himself.sun_path[i]); printf( "\n\n" ); if( read( as, buf, 80 ) < 0 ) { perror( "und_recv: read" ); exit( 1 ); } printf( "Read: %s\n", buf ); } ----------------CUT HERE------------- So, that's all, folks. I'm posting this instead of directly mailing it because I'm pretty sure that other people have also had problems with unix-domain sockets. ____________ #include <appropriate_disclaimers> VOICE: +1 212 280 5510 ARPA: ioannidis@cs.columbia.EDU USnail: John Ioannidis ji@garfield.columbia.EDU 450 Computer Science Columbia University, USENET: ...{seismo|topaz}! New York, NY 10027 columbia!garfield!ji ... It's all Greek to me!