Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.3 alpha 4/15/85; site greipa.UUCP Path: utzoo!utcs!lsuc!pesnta!greipa!jordan From: jordan@greipa.UUCP (Jordan K. Hubbard) Newsgroups: net.unix Subject: AF_INET sockets, code examples needed. Message-ID: <240@greipa.UUCP> Date: Tue, 11-Jun-85 19:11:58 EDT Article-I.D.: greipa.240 Posted: Tue Jun 11 19:11:58 1985 Date-Received: Thu, 20-Jun-85 03:47:20 EDT Reply-To: jordan@greipa.UUCP (Jordan K. Hubbard) Organization: Genstar Rental Electronics, Palo Alto, Ca. Lines: 110 Thank you for all the responses on my AF_UNIX domain socket question. selecting the accepting socket works nicely. Now for another question, I've built a simplistic server/client model for testing AF_INET sockets and it doesn't work.. I've declared the server as a 'service' and done the appropriate get host and server calls and bound the socket. Connections are accepted, but the accept call returns a fd with a value of zero! This causes obvious problems when the server tries to read the new socket.. The salient portions of the client/server code follow. -- client code -- (host name is passed as 'host') struct hostent *cafe; /* host table entry */ struct servent *waiter; /* sevice file entry */ struct sockaddr_in sin;/* socket address */ if ((cafe = gethostbyname(host)) == NULL) { fprintf(stderr, "client: Unknown host %s\n", host); return(-1); } if ((waiter = getservbyname("george", "tcp")) == NULL) { fprintf(stderr, "client: george/tcp: unknown service\n"); return(-1); } if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("client"); return(-1); } sin.sin_family = cafe->h_addrtype; bcopy(cafe->h_addr, (caddr_t)&sin.sin_addr, cafe->h_length); sin.sin_port = waiter->s_port; if (connect(fd, (caddr_t)&sin, sizeof(sin), 0) < 0) { perror("client"); close(fd); return(-1); } /* Send a silly message to the server */ strcpy(buff, "a burger and fries"); write(fd, buff, strlen(buff)); /* read in the response */ while (read(fd, buff, 80) > 0) printf("Waiter: '%s'\n", buff); close(fd); -- server code -- struct servent *me; /* sevice file entry */ struct sockaddr_in sin;/* socket address */ int fd; int nf, sz; /* new fd and size of sin */ char buff[132], buff2[132]; /* server buffer */ if ((sir = getservbyname("george", "tcp")) == NULL) { fprintf(stderr, "server: george/tcp: unknown service\n"); return(-1); } if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("server (socket):"); return(-1); } sin.sin_family = AF_INET; sin.sin_port = sir->s_port; sz = sizeof(sin); if (bind(fd, (caddr_t)&sin, sz) < 0) { perror("server/bind"); return(-1); } if (listen(fd, 5) < 0) { perror("server/listen"); return(-1); } /* deal with requests */ while (are_open) { if (nf = accept(fd, (caddr_t)&sin, &sz) < 0) { THIS IS THE PUD perror("server/accept"); return(-1); } while (read(nf, buff, 132)) { if (!strcmp(buff, "health inspection")) { are_open = FALSE; break; } sprintf(buff2, "%s, coming right up sir.\n", buff); write(nf, buff2, 132); } close(nf); } -- Jordan K. Hubbard @ Genstar Rental Electronics. Palo Alto, CA. {pesnta, decwrl, dual, pyramid}!greipa!jordan "Ack ack!". - William the feline