From owner-FreeBSD-users-jp@jp.freebsd.org  Sun Jan 21 16:28:18 2001
Received: (from daemon@localhost)
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) id QAA43550;
	Sun, 21 Jan 2001 16:28:18 +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 QAA43545
	for <FreeBSD-users-jp@jp.freebsd.org>; Sun, 21 Jan 2001 16:28:18 +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 QAA05506
	for <FreeBSD-users-jp@jp.freebsd.org>; Sun, 21 Jan 2001 16:28:17 +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 QAA26745
	for <FreeBSD-users-jp@jp.freebsd.org>; Sun, 21 Jan 2001 16:28:17 +0900 (JST)
	(envelope-from amadeus@yk.rim.or.jp)
Message-Id: <200101210728.QAA26745@shell.rim.or.jp>
From: Takaaki Nomura (=?ISO-2022-JP?B?GyRCTG5CPDliTEAbKEI=?=)
    <amadeus@yk.rim.or.jp>
To: FreeBSD-users-jp@jp.freebsd.org
In-reply-to: Your message of "Sun, 21 Jan 2001 15:32:22 JST"
References: <200101210632.f0L6WMR00630@iris.dti.ne.jp> 
Mime-Version: 1.0
Content-Type: text/plain;charset="ISO-2022-JP"
Date: Sun, 21 Jan 2001 16:28:17 +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 58452
Subject: [FreeBSD-users-jp 58452] Re: 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

On Sun, 21 Jan 2001 15:32:22 +0900 (JST),
dais@iris.dti.ne.jp (Daisuke Higashi) wrote:
>In article ``[FreeBSD-users-jp 58448] TCP/IP sample program''
>amadeus@yk.rim.or.jp wrote:
>> $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
>
>bind $B$9$k(B IP $B%"%I%l%9$r;XDj$9$k$N$rK:$l$F$$$^$9$M!#(B
>$BFC$K;XDj$7$J$$>l9g$O!"<!$N$h$&$K(B INADDR_ANY $B$rM?$($kI,MW$,$"$j$^$9!#(B
>
>      myaddr.sin_addr.s_addr =  htonl(INADDR_ANY);
>
>INADDR_ANY $B$O<B$O(B 0 $B$J$N$G!"(B
>$B4D6-$K$h$C$F$O$3$N$h$&$J;XDj$r$7$J$/$F$b(B
>(s_addr $B$K$?$^$?$^(B 0 $B$,F~$C$F$$$?$?$a$K(B)
>$BF0$$$F$7$^$&$3$H$O$"$k$+$b$7$l$^$;$s!#(B

$B$I$&$b$"$j$,$H$&$4$6$$$^$9!#(BFreeBSD 3.3R $B$G$O!"$3$l$GF0$-$^$7$?!#KvHx$K(B
$BIU$1$?(B client.c $B$r%3%s%Q%$%k$7$?(B client $B$G2?$+%-!<%\!<%I$+$iF~NO$9$k$H!"(B
$B$=$l$,%5!<%P$K$h$j%(%3!<$5$l!"(Bclient $B$NJ}$K:F$S=PNO$5$l$^$9!#(B

$B;(;o$NJ}$G$b$=$&$J$C$F$$$?$N$G$9$,!"(Bselect $B$N%j%?!<%sCM(B nfd $B$,Ii$K$J$C$F(B
$B$b=*N;$5$;$J$$J}$,$$$$$h$&$G$9$M!#(Bclient $B$r=*N;$5$;$k$H!"(B

server: select: Interrupted system call

$B$G6&E]$l$K$J$C$F$7$^$$$^$9!#(B

$B4D6-(B(FreeBSD 2.2.8R, Solaris 8)$B$K$h$C$F$O!"(Bclient $B$r5/F0$7$?$H$?$s!"(B

server: accept: Bad address

$B$G=*$C$F$7$^$&$N$G$9$,!"$3$l$O2?8N$G$7$g$&!)(B

>$B$H$3$m$G!"(B
>
>>     myaddr.sin_port = atoi(port);
>
>$B$3$l!"%M%C%H%o!<%/%P%$%H%*!<%@$KD>$5$J$/$F$$$$$s$G$7$g$&$+!#(B

51$B9TL\$G!"(B

myaddr.sin_port = htons(myaddr.sin_port);

$B$H$7$F$$$k$N$G!"$$$$$N$G$O$J$$$G$7$g$&$+!)(B

------------------------------- client.c ------------------------------
#include <stdio.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define BUFSIZE  4096
#define DEF_HOST "localhost"
#define DEF_PORT "3000"

main(int argc, char **argv)
{
    char buf[BUFSIZE], *host = DEF_HOST, *port = DEF_PORT;
    int len, nfd, s;
    fd_set rfds;
    struct hostent *hp;
    struct servent *sp;
    struct sockaddr_in addr;

    if (argc > 3) {
	fprintf(stderr, "Usage: client [host [port]]\n");
	exit(1);
    }

    if (argc > 1) {
	host = argv[1];
	if (argc == 3)
	    port = argv[2];
    }

    if ((hp = gethostbyname(host)) == NULL) {
	if ((hp = gethostbyaddr(host, 4, PF_INET)) == NULL) {
	    perror("client: gethostbyaddr");
	    exit(1);
	}
    }

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

    addr.sin_family = AF_INET;
    addr.sin_port = atoi(port);
    if (addr.sin_port == 0) {
	if ((sp = getservbyname(port, "tcp")) == NULL) {
	    fprintf(stderr, "%s: unknown service.\n", port);
	    exit(1);
	}
	addr.sin_port = sp->s_port;
    } else
	addr.sin_port = htons(addr.sin_port);
    bcopy(hp->h_addr, &addr.sin_addr.s_addr, hp->h_length);
    if (connect(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
	perror("client: connect");
	exit(1);
    }
    fprintf(stderr, "connected.\n");

    while (1) {
	FD_ZERO(&rfds);
	FD_SET(0, &rfds);
	FD_SET(s, &rfds);
	if ((nfd = select(s + 1, &rfds, NULL, NULL, NULL)) > 0) {
	    if (FD_ISSET(0, &rfds)) {
		if ((len = read(0, buf, BUFSIZE)) == 0) {
		    printf("EOF on keyboard.\n");
		    break;
		} else if (len > 0) {
		    switch (buf[0]) {
			case '0' :
			    shutdown(s, 0);
			    break;
			case '1' :
			    shutdown(s, 1);
			    break;
			case '2' :
			    shutdown(s, 2);
			    break;
			default :
			    if (write(s, buf, len) < 0)
				perror("client: write");
			    break;
		    }
		} else {
		    perror("server: read");
		    break;
		}
	    }

	    if (FD_ISSET(s, &rfds)) {
		if ((len = read(s, buf, BUFSIZE)) == 0) {
		    fprintf(stderr, "EOF on socket.\n");
		    break;
		} else if (len > 0)
		    write(1, buf, len);
		else {
		    perror("client: write");
		    break;
		}
	    }
	} else if (nfd < 0) {
	    perror("server: select");
	    break;
	}
    }
    close(s);
}
