Return to BSD News archive
Xref: sserve comp.unix.bsd:14015 comp.lang.c:70378 Newsgroups: comp.unix.bsd,comp.lang.c Path: sserve!newshost.anu.edu.au!harbinger.cc.monash.edu.au!yeshua.marcam.com!news.kei.com!world!clintp From: clintp@world.std.com (Clinton A Pierce) Subject: Problem coding Sockets Message-ID: <Cq9op0.3E2@world.std.com> Followup-To: poster Summary: Sorry about the crosspost--still no answers Organization: The World Public Access UNIX, Brookline, MA Date: Mon, 23 May 1994 18:00:35 GMT Lines: 143 Ok, I'm tinkering with sockets on serveral AIX RS/600's and I have a short demo program (enclosed). I have one machine that will NOT run this code. When the client tries to connect(), he gets "Permission denied". What permission? Code edited for brevity: The server's code #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> #include <string.h> #include <netdb.h> #include <stdio.h> extern int errno; main(argc, argv) int argc; char **argv; { char c; int sock; FILE *fp, *tempfile; int fromlen; char hostname[64], xms[123]; struct hostent *hp; int i, s, ns; struct sockaddr_in sin, fsin; if (argc!=3) { fprintf(stderr, "Usage server socket filename"); } tempfile=fopen(argv[2], "r"); if (tempfile==NULL) exit(2); fclose (tempfile); sock=atoi(argv[1]); if (sock==0) exit(2); gethostname(hostname, sizeof(hostname)); if ((hp=gethostbyname(hostname))==NULL) { fprintf(stderr, "%s: host unknown.\n", hostname); exit(1); } if ((s=socket(AF_INET, SOCK_STREAM, 0))<0) { perror("server:socket"); exit(1); } sin.sin_family=AF_INET; sin.sin_port=htons(sock); bcopy(hp->h_addr, &sin.sin_addr, hp->h_length); if (bind(s, &sin, sizeof(sin)) < 0) { perror("server:bind"); exit(1); } if (listen(s, 5)<0) { perror("server:listen"); exit(1); } if ((ns=accept(s, &fsin, &fromlen))<0) { perror("server:accept"); exit(1); } fp=fdopen(ns, "r"); [Useful portion of code removed] fclose(tempfile); close(s); exit(0); } And the client: #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> extern int errno; main(argc, argv) int argc; char **argv; { char c; int sock; FILE *fp; int fromlen; char hostname[64]; struct hostent *hp; int i, s; struct sockaddr_in sin; sock=atoi(argv[1]); if (sock==0) exit(2); gethostname(hostname, sizeof(hostname)); if ((hp=gethostbyname(hostname))==NULL) { fprintf(stderr, "%s: host unknown.\n", hostname); exit(1); } if ((s=socket(AF_INET, SOCK_STREAM, 0))<0) { perror("client:socket"); exit(1); } sin.sin_family=AF_INET; sin.sin_port=htons(sock); bcopy(hp->h_addr, &sin.sin_addr, hp->h_length); if (connect(s, &sin, sizeof(sin)) < 0) { perror("client:connect"); exit(1); } [useful section of code deleted] close(s); exit(0); } Can anyone help with this? This should be so straightforward! And why only one system does this? (I'm NOT running this over a network--yet. It's still only local.) Help!