From owner-FreeBSD-users-jp@jp.freebsd.org  Sun Jan 21 14:50:20 2001
Received: (from daemon@localhost)
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) id OAA39215;
	Sun, 21 Jan 2001 14:50:20 +0900 (JST)
	(envelope-from owner-FreeBSD-users-jp@jp.FreeBSD.org)
Received: from multi.al.rim.or.jp (multi.al.rim.or.jp [202.247.191.124])
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) with ESMTP id OAA39210
	for <FreeBSD-users-jp@jp.freebsd.org>; Sun, 21 Jan 2001 14:50:19 +0900 (JST)
	(envelope-from amadeus@yk.rim.or.jp)
Received: from shell.rim.or.jp
	by multi.al.rim.or.jp (3.7W/HMX-12) id OAA03886
	for <FreeBSD-users-jp@jp.freebsd.org>; Sun, 21 Jan 2001 14:50:19 +0900 (JST)
Received: from shell.al.rim.or.jp (amadeus_yk@localhost [127.0.0.1])
	by shell.rim.or.jp (8.9.3/3.7W/DI-2000071215) with ESMTP id OAA99837
	for <FreeBSD-users-jp@jp.freebsd.org>; Sun, 21 Jan 2001 14:50:19 +0900 (JST)
	(envelope-from amadeus@yk.rim.or.jp)
Message-Id: <200101210550.OAA99837@shell.rim.or.jp>
To: FreeBSD-users-jp@jp.freebsd.org
From: Takaaki Nomura (=?ISO-2022-JP?B?GyRCTG5CPDliTEAbKEI=?=)
    <amadeus@yk.rim.or.jp>
Mime-Version: 1.0
Content-Type: text/plain;charset="ISO-2022-JP"
Date: Sun, 21 Jan 2001 14:50:19 +0900
Reply-To: FreeBSD-users-jp@jp.freebsd.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+000315
X-Sequence: FreeBSD-users-jp 58448
Subject: [FreeBSD-users-jp 58448] TCP/IP sample program
Errors-To: owner-FreeBSD-users-jp@jp.freebsd.org
Sender: owner-FreeBSD-users-jp@jp.freebsd.org
X-Originator: amadeus@yk.rim.or.jp

$BLnB<!w(Binter.net $B$G$9!#(B

$B%M%C%H%o!<%/=i?4<T$G$9!#K?;(;o$K:\$C$F$$$?<!$N$h$&$J%W%m%0%i%`$r<B9T(B
$B$9$k$H!"(Bbind $B$N$H$3$m$G!"(B

server: bind: Can't assign requested address

$B$HI=<($5$l$F=*N;$7$F$7$^$$!"@h$K?J$_$^$;$s!#2?$+=hM}$,H4$1$F$$$k$N$@(B
$B$H;W$$$^$9$,!"$*J,$+$j$K$J$kJ}$O$*$i$l$^$9$+!)(B

----------------------------- server.c -------------------------------
#include <stdio.h>
#include <signal.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netinet/in.h>

#define BUFSIZE 4096
#define PORT	"3000"

extern int errno;

void doecho(), getchild();

main(int argc, char **argv)
{
    char *port = PORT;
    int ns, nfd, s, size;
    fd_set rfds;
    struct servent *sp;
    struct sockaddr_in myaddr, hisaddr;

    if (!isatty(0)) {
	printf("executed by inetd.\n");
	doecho(0);
	exit(0);
    }

    if (argc > 2) {
	fprintf(stderr, "Usage: server [port]\n");
	exit(1);
    } else if (argc == 2)
	port = argv[1];

    if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
	perror("server: socket");
	exit(1);
    }

    myaddr.sin_family = AF_INET;
    myaddr.sin_port = atoi(port);
    if (myaddr.sin_port == 0) {
	if ((sp = getservbyname(port, "tcp")) == NULL) {
	    fprintf(stderr, "%s: unknown service.\n", port);
	    exit(1);
	}
	myaddr.sin_port = sp->s_port;
    } else
	myaddr.sin_port = htons(myaddr.sin_port);

    if (bind(s, (struct sockaddr *)&myaddr, sizeof(myaddr)) < 0) {
	perror("server: bind");
	exit(1);
    }

    signal(SIGCHLD, getchild);
    if (listen(s, 2) < 0) {
	perror("server : listen");
	exit(1);
    }

    FD_ZERO(&rfds);
    while (1) {
	FD_SET(s, &rfds);

	if ((nfd = select(s + 1, &rfds, NULL, NULL, NULL)) < 0) {
	    perror("server: select");
	    exit(1);
	}

	if (FD_ISSET(s, &rfds)) {
	    if ((ns = accept(s, (struct sockaddr *)&hisaddr, &size)) < 0) {
	        perror("server: accept");
	        exit(1);
	    }
	    if (fork() == 0) {
		close(s);
		doecho(ns);
		exit(0);
	    } else
		close(ns);
	}
    }
}

void doecho(int fd)
{
    char buf[BUFSIZE];
    int len;

    while (1) {
	if ((len = read(fd, buf, BUFSIZE)) > 0)
	    write(fd, buf, len);
	else
	    break;
    }
}

void getchild()
{
    int status;

    while (1)
	if (wait3(&status, WNOHANG, (struct rusage *)0) <= 0)
	    break;
}
