Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
$B%7%9%F%`%W%m%0%i%`!JBh(B7$B=5!K(B:
[go: Go Back, main page]

$B%7%9%F%`%W%m%0%i%`!JBh(B7$B=5!K(B: $B%M%C%H%o!<%/!&%W%m%0%i%_%s%0!?%5!<%PB&(B


$BEE;R!&>pJs9)3X7O(B/$B%7%9%F%`>pJs9)3X8&5f2J(BCS$B@l96(B
$B?7>k(B $BLw(B
<yas@is.tsukuba.ac.jp>

$B$3$N%Z!<%8$O!" http://www.coins.tsukuba.ac.jp/~syspro/2005/No7.html
$B$"$k$$$O!" http://www.coins.tsukuba.ac.jp/~syspro/2005/
http://www.coins.tsukuba.ac.jp/~yas/

$B:#F|$N=EMW$JOC(B

$BI|=,(B

echo$B%5!<%P(B

TCP/IP $B$N%]!<%HHV9f(B 7 (echo) $B$G$O!"echo-server-nofork-fdopen.c
   1:	
   2:	/*
   3:	        echo-server-nofork-fdopen.c -- $B

$B0z?t$H$7$F!"%]!<%HHV9f$re$N$h$&$K(B 
UID $B$+$i@8@.$9$kJ}K!$O!"0lHLE*$G$O$J$$!#!JC^GHBg3X>pJs3XN`$N%7%9%F%`$G(B
$B$O$&$^$/F/$/!#!K(B

  39:	void
  40:	echo_server( int portno )
  41:	{
  42:	    int acc,com ;
  43:	        acc = tcp_acc_port( portno );
  44:	        if( acc<0 )
  45:	            exit( -1 );
  46:	        print_my_host_port( portno );
  47:	        while( 1 )
  48:	        {
  49:	            if( (com = accept( acc,0,0 )) < 0 )
  50:	            {
  51:	                perror("accept");
  52:	                exit( -1 );
  53:	            }
  54:	            tcp_peeraddr_print( com );
  55:	            echo_reply( com );
  56:	        }
  57:	}
  58:	

tcp_acc_port() $B$O!"0z?t$GM?$($i$l$?%]!<%HHV9f$r;H$C$F@\B3MW5a

$B%5!<%P$N%W%m%0%i%`$NFCD'$O!"FbIt$KL58B%k!<%W$r;}$C$F$$$k$3$H$G$"$k!#(B $B%5!<%P$O!"IaDL$N>uBV$G$O!"=*N;$7$J$$!#(B

accept() $B$O!"@\B3MW5a$rBT$D%7%9%F%`%3!<%k$G$"$k!#%/%i%$%"%s%H$+$i@\B3(B $B$,Mh$k$^$G!"%7%9%F%`%3!<%k$r

tcp_peeraddr_print() $B$O!"DL?.Aj

  59:	#define BUFFERSIZE      1024
  60:	
  61:	void
  62:	echo_reply( int com )
  63:	{
  64:	    char line[BUFFERSIZE] ;
  65:	    int rcount ;
  66:	    int wcount ;
  67:	    FILE *in, *out ;
  68:	
  69:	        if( fdopen_sock(com,&in,&out) < 0 )
  70:	        {
  71:	            fprintf(stderr,"fdooen()\n");
  72:	            exit( 1 );
  73:	        }
  74:	        while( fgets(line,BUFFERSIZE,in) )
  75:	        {
  76:	            rcount = strlen( line );
  77:	            printf("[%d] received (fd==%d) %d bytes, [%s]\n",getpid(),com,rcount,line );
  78:	            fflush( stdout );
  79:	            fprintf(out,"%s",line );
  80:	        }
  81:	        printf("[%d] connection (fd==%d) closed.\n",getpid(),com );
  82:	        fclose( in );
  83:	        fclose( out );
  84:	}
  85:	
$B$3$N(B echo_reply() $B$O!"FCDj$N%/%i%$%"%s%H@lMQ$N(Becho $B%5!<%S%9$rDs6!$9$k!#(B $B%/%i%$%"%s%H$+$i$NMW5a$,B3$/8B$j!"F0:n$9$k!#(B

$B$3$N%W%m%0%i%`$G$O!"(B $B%/%i%$%"%s%HB&(B $B$HF1MM$K(B fdopen_sock() $B$r;H$C$F!"DL?.2DG=$J%U%!%$%k5-(B $B=R;R(B com $B$+$i#2$D$N(B FILE * $B$r:n@.$7$F$$$k!##1$D$O!"F~NOMQ!"#1$D$O=PNO(B $BMQ$G$"$k!#$=$N7k2L!"(B $B9b?e=`F~=PNO%i%$%V%i%j(B $B$r;H$C$FDL?.$,9T$($k$h$&$K$J$C$F$$$k!#(Bfprintf() $B$G=PNOMQ$N(B FILE * $B$K=q(B $B$-9~$`$H!"%M%C%H%o!<%/$KBP$7$F%G!<%?$,Aw$j=P$5$l$k!#F~NOMQ$N(B FILE * $B$K(B fgets() $B$r9T$&$H!"%M%C%H%o!<%/$+$i%G!<%?$r

$B%/%i%$%"%s%H$+$i$NMW5a$O!"(Bfgets() $B$GFI9~$s$G$$$k!#$=$l$r!"%5!<%PB&$NC<(B $BKv$K(B printf() $B$GI=<($7$F$$$k!#(Bfflush() $B$O!"(Bprintf() $B$NFbIt$N%P%C%U%!(B (stdout$B$N%P%C%U%!(B)$B$KN/$C$F$$$k%G!<%?$r=q$-=P$9$b$N$G$"$k!#(B

$B%/%i%$%"%s%H$K$O!"(Bfprintf() $B$G7k2L$rAw$jJV$7$F$$$k!#(B

  86:	void
  87:	print_my_host_port( int portno )
  88:	{
  89:	    char hostname[100] ;
  90:	        gethostname( hostname,sizeof(hostname) );
  91:	        hostname[99] = 0 ;
  92:	        printf("run telnet %s %d \n",hostname, portno );
  93:	}
  94:	
print_my_host_port() $B$O!"(Btelnet $B$G@\B3$9$k;~$N%R%s%H$rI=<($9$k!#(B gethostname() $B%7%9%F%`%3!<%k$G<+J,<+?H$N%[%9%HL>$r(B(IP$B%"%I%l%9$H(B $BBP1~$7$F$$$k(B))$B$,0lCW$7$F0[$J$$$3$H$,$"$k!#(B

  95:	void
  96:	tcp_peeraddr_print( int com )
  97:	{
  98:	    struct sockaddr_storage addr ;
  99:	    int addr_len ;
 100:	        addr_len = sizeof( addr );
 101:	        if( getpeername( com, (struct sockaddr *)&addr, &addr_len  )<0 )
 102:	        {
 103:	            perror("tcp_peeraddr_print");
 104:	            return;
 105:	        }
 106:	        printf("[%d] connection (fd==%d) from ",getpid(),com );
 107:	        sockaddr_print( (struct sockaddr *)&addr, addr_len );
 108:	        printf("\n");
 109:	}
 110:	
 111:	void
 112:	sockaddr_print( struct sockaddr *addrp, int addr_len )
 113:	{
 114:	    char host[BUFFERSIZE] ;
 115:	    char port[BUFFERSIZE] ;
 116:	        if( getnameinfo(addrp, addr_len, host, sizeof(host),
 117:	                        port, sizeof(port), NI_NUMERICHOST|NI_NUMERICSERV)<0 )
 118:	            return;
 119:	        printf("%s:%s", host, port );
 120:	}
 121:	
tcp_peeraddr_print() $B$O!"DL?.Ajl9g!"(BIP$B%"%I(B $B%l%9$H%]!<%HHV9f(B)$B$rI=<($9$k!#DL?.Aj

IP $B%"%I%l%9$O!"(BIPv4 $B$G$O!"(B32 $B%S%C%H(B(int)$B$G$"$j!"(B $B%]!<%HHV9f$O!"(B16 $B%S%C%H(B(sort)$B$G$"$k!#(B $B$3$3$G$O!"(Bgetnameinfo() $B%i%$%V%i%j4X?t$rMQ$$$F%[%9%HL>$H%]!<%HHV9f$N(B $BJ8;zNsI=8=$KJQ49$7$F$$$k!#$3$N;~!"(BNUMERIC $B$H;XDj$7$$$k$N$G!"(B IPv4 $B$G$O!"%I%C%H!V(B.$B!W$G6h@Z$i$l$?(B10$B?J?t#4$D$K$J$k!#(B

getnameinfo() $B$,;H$o$l$F$$$kItJ,$G$O!"0JA0$O!"(Bgethostbyaddr() $B$,;H$o$l(B $B$F$$$?!#(B

 122:	tcp_acc_port( int portno )
 123:	{
 124:	    struct sockaddr_in addr ;
 125:	    int addr_len ;
 126:	    int s ;
 127:	
 128:	        if( (s = socket(PF_INET, SOCK_STREAM, 0)) < 0 )
 129:	        {
 130:	            perror("socket");
 131:	            return( -1 );
 132:	        }
 133:	
 134:	        memset( &addr, 0, sizeof(addr) );
 135:	        addr.sin_family = AF_INET ;
 136:	        addr.sin_addr.s_addr = INADDR_ANY ;
 137:	        addr.sin_port = htons( portno );
 138:	
 139:	        if( bind(s,(struct sockaddr *)&addr,sizeof(addr)) < 0 )
 140:	        {
 141:	            perror("bind");
 142:	            fprintf(stderr,"port number %d is already used. wait a moment or kill another program.\n", portno );
 143:	            return( -1 );
 144:	        }
 145:	        if( listen( s, 5 ) < 0 )
 146:	        {
 147:	            perror("listen");
 148:	            close( s );
 149:	            return( -1 );
 150:	        }
 151:	        return( s );
 152:	}
 153:	
tcp_acc_port() $B$O!"(B $BDL?.O)$N3+@_(B $B$N;E;v$N$&$A!"%5!<%PB&$G@\B3MW5aPF_INET $B$H(B SOCK_STREAM$B$NAH$_9g$o$;(B $B$J$N$G!"(BTCP $B$r;H$&$3$H$r0UL#$9$k!#(B

socket() $B$N0z?t$G!"(BPF_INET $B$NJQ$j$K!"(BAF_INET $B$H=q$$$F$b$h$$!#$3$3$G$O!"(B Protocol $B$rA*$s$G$$$k$N$G!"(BPF_ $B$,@5$7$$$,!"

$B%=%1%C%H$,:n@.$G$-$?$i!"(Bbind() $B%7%9%F%`%3!<%k$G!"%5!<%PB&$GMxMQ$9$k%"(B $B%I%l%9(B(IP$B%"%I%l%9$H%]!<%HHV9f(B)$B$r@_Dj$9$k!#(BIP $B%"%I%l%9$O!"(BIPv4 $B$G$OIaDL!"(B INADDR_ANY $B$r;XDj$9$k!#J#?t$N(B IP $B%"%I%l%9$,$"$k;~$K$O!"$I$l$KMW5a$,Mh(B $B$F$b

$B%]!<%HHV9f$O!"0z?t$GM?$($i$l$?$b$N$r!"(Bhtons() $B$G%M%C%H%o!<%/!&%P%$%H%*!<(B $B%@$KJQ49$7$FM?$($k!#(B

$B

$BCm0U!'$3$N%W%m%0%i%`$K$O(B $BJ#?t$N%/%i%$%"%s%H$KBP$7$F%5!<%S%9$rF1;~$KDs6!$G$-$J$$(B $B$H$$$&LdBj$,$"$k!#(B

bind() $B$9$k(B addr $B$r!"(Bgetaddrinfo() $B$GD4$Y$kN.57(B(IPv6$BIw(B)$B$b$"$k!#$3$N>l(B $B9g!"(Bgetaddrinfo()$B$NBh0l0z?t$K$O!"(BNULL $B$rF~$l!"(Bhints.ai_flags $B$K$O(B AI_PASSIVE $B$r@_Dj$9$k!#(B

$B

$B%5!<%PB&!#(B $B%5!<%P$O!"=*N;$7$J$$$N$G!":G8e$K!"(B^C $B$r2!$7$F!"3d$j9~$_$r3]$1(B $B$F=*N;$5$;$k!#(B

$BCm0U!'A40w$,%]!<%HHV9f(B 1231 $B$r;H$&$H%W%m%0%i%`$,F0$+$J$$$3$H$,$"$k!#(B


% cp ~yas/syspro/ipc/echo-server-nofork-fdopen.c . [$B
% make echo-server-nofork-fdopen [$B
cc     echo-server-nofork-fdopen.c   -o echo-server-nofork-fdopen
% ./echo-server-nofork-fdopen 1231 [$B
run telnet adonis9.coins.tsukuba.ac.jp 1231 
[6419] connection (fd==4) from 130.158.86.28:47329
[6419] received (fd==4) 5 bytes, [123
]
[6419] received (fd==4) 5 bytes, [456
]
[6419] received (fd==4) 5 bytes, [790
]
[6419] connection (fd==4) closed.
^C
% []
$B%/%i%$%"%s%HB&(B
% telnet adonis9.coins.tsukuba.ac.jp 1231  [$B
Trying 130.158.86.29...
Connected to adonis9.coins.tsukuba.ac.jp.
Escape character is '^]'.
123[$B
123
456[$B
456
790[$B
790
^][$B
telnet> quit[$B
Connection closed.
% []

$BJ#?t$N%/%i%$%"%s%H$KBP$9$k%5!<%S%9$NF1;~Ds6!(B

$BJ#?t$N%/%i%$%"%s%H$KBP$7$F%5!<%S%9$NF1;~$KDs6!$9$k$3$H$,K>$^$7$$!#(B echo-server-nofork-fdopen.c $B$O!"#1$D$N%/%i%$%"%s%H$+$i$N@\B3$5$l$k$H!"$=$N%/%i%$%"%s%H$K3]$j@Z$j$K(B $B$J$C$F!"B>$N%/%i%$%"%s%H$K$O%5!<%S%9$rDs6!$G$-$J$$$H$$$&LdBj$,$"$k!#(B $BI8=`$N(B echo $B%5!<%P(B($B%]!<%HHV9f(B 7 $B$GF0:n$7$F$$$k(B) $B$O!"J#?t$N%/%i%$%"%s%H(B $B$+$i@\B3$5$l$l$?>l9g!"F1;~$K%5!<%S%9$rDs6!$9$k$3$H$,$G$-$k!#(B

$BJ#?t$N%/%i%$%"%s%H$KBP$7$F%5!<%S%9$NF1;~$KDs6!$9$k$K$O

  • $B%/%i%$%"%s%H$4$H$K(B fork() $B$G%W%m%;%9$r%3%T!<$9$k!#(B
  • $B%/%i%$%"%s%H$4$H$K(B $B%9%l%C%I(B$B$r@8@.$9$k!#(B
  • select() $B$rMQ$$$F!"J#?t$N@\B3$r4F;k$7!"%G!<%?$,FO$$$?$3$H$r3NG'$7(B $B$F$+$iFI$_9~$`!#(B

    fork()$B$K$h$kJ#?t$N%/%i%$%"%s%H$KBP$9$k%5!<%S%9$NF1;~Ds6!(B

    select()$B$K$h$kJ#?t$N%/%i%$%"%s%H$KBP$9$k%5!<%S%9$NF1;~Ds6!(B

    Pthread$B$K$h$kJ#?t$N%/%i%$%"%s%H$KBP$9$k%5!<%S%9$NF1;~Ds6!(B

    snprintf()

    strcpy(), strcat() $B$NBe$j$K(B snprintf() $B$,JXMx$J>l9g$,$"$k!#(B
       1:	/*
       2:	        string-snprintf.c -- snprintf $B$r;H$C$?J8;zNs$N%3%T!<$H7k9g(B
       3:	        ~yas/syspro/string/string-snprintf.c
       4:	        Start: 2002/04/21 23:02:39
       5:	*/
       6:	
       7:	#include <stdio.h> /* stderr, snprintf() */
       8:	#include <stdlib.h> /* malloc() */
       9:	
      10:	main()
      11:	{
      12:	    char buf[100];
      13:	        if( snprintf(buf,100,"hello%s\n",",world") >=sizeof(buf) )
      14:	        {
      15:	            fprintf(stderr,"buffer overflow\n");
      16:	            exit( 1 );
      17:	        }
      18:	        printf("%s",buf );
      19:	}
      20:	
    
    snprintf() $B$O!"Bh#10z?t$K!"%P%C%U%!$NHVCO!"Bh#20z?t$K%P%C%U%!$ND9$5(B($B:G(B $B8e$N(B0$B$r4^$`(B)$B$r$H$k!#Bh#30z?t0J9_$O!"(Bprintf() $B$HF1$8$G$"$k!#(Bsnprintf() $B$G$O!"$1$C$7$F%P%C%U%!!&%*!<%P!<%U%m!<$O5/$-$J$$!#5/$-$=$&$K$J$k$H!"Ii(B $B$N?t$rJV$9!#!J@.8y$9$k$H!"%P%$%H?t(B($B:G8e$N(B0$B$O4^$^$J$$(B)$B$rJV$9!#!K(B

    snprintf() $B$O!"(B%s $B0J30$K(B %d $B$d(B %c $B$b;H$($k!#(B

    $BCm0U!'(BLinux (Glibc $B$r;H$C$F$$$k(B)$B$G$O!"(Bsnprintf() $B$N;EMM$,JQ99$5$l$?!#(B $B8E$$;EMM(B(glibc 2.0.6$B0JA0(B)$B$G$O!"(Bsnprinf() $B$O!"%(%i!<$,5/$-$k$H(B -1 $B$rJV(B $B$9!#?7$7$$;EMM(B(glibc 2.1$B0J9_(B)$B$G$O!"(Bsnprintf() $B$O!"I,MW$J%P%$%H?t!"$9$J(B $B$o$A!"%P%C%U%!$,L58BBg$G$"$k$H$-$K=q$-9~$^$l$kJ8;zNs$ND9$5(B($B:G8e$N(B0$B$r=|(B $B$/(B)$B$rJV$9!#$3$l$O!"(Bstrlen() $B$,JV$9$b$N$HF1$8$G$"$k!#=>$C$F!"?7$7$$(B snprintf() $B$G$O!"7k2L$H%P%C%U%!$NBg$-$5$rHf3S$7$F@53N$K=q$-9~$^$l$?$+(B $B$r8!::$9$k!#(B(snprintf() $B$O!"7h$7$F%P%C%U%!!&%*!<%P!<%U%m!<$r5/$3$9$3$H(B $B$O$J$$$,!"%P%C%U%!$,B-$j$J$$;~$K$O0U?^$7$F$$$J$$7k2L$,J]B8$5$l$F$$$k$3(B $B$H$K$J$k!#(B)

    $B8E$$(B Unix $B$d8E$$(B Linux $B$G$O(B snprintf $B$O(B sprintf $B$r8F$S=P$7$F$$$k$@$1$N$3$H$,$"$j!"0BA4$G$O$J$$$3$H$,$"$k(B$B!#(B coins $B$N4D6-$OLdBj$J$$!#(B

    snprintf()$B$K$h$k(Bstr*() $B$NCV$-49$((B

    strcpy(dst,src)
    snprintf(dst,destsize,"%s",src)
    strcat(dest,src)
    snprintf(buf,bufsize,"%s%s",dest,src) ($B9M$(J}$NE>49$,I,MW(B)
    fdopen_sock() $B$rMQ$$$?%W%m%0%i%_(B $B%s%0$N>l9g!"%M%C%H%o!<%/$KBP$9$kAw?.$G$O!"(Bsnprintf() $B$OITMQ$G!"(B fprintf() $B$G==J,$J>l9g$,B?$$!#(B

    echo$B%5!<%P(B(Java$BHG(B)

       1:	/*
       2:	        EchoServerSingle.java -- $BJ8;zNs$rAw
    
    $B0z?t$H$7$F!"%]!<%HHV9f$r

      22:	    public static void echo_server( int portno ) throws IOException
      23:	    {
      24:	        ServerSocket acc = new ServerSocket( portno );
      25:	        print_my_host_port( portno );
      26:	        while( true )
      27:	        {
      28:	            Socket com = acc.accept();
      29:	            tcp_peeraddr_print( com );
      30:	            EchoServerWorker esw = new EchoServerWorker(com);
      31:	            esw.run();
      32:	        }
      33:	    }
    

    ServerSocket() $B$O!"0z?t$GM?$($i$l$?%]!<%HHV9f$r;H$C$F@\B3MW5a

    print_my_host_port() $B$O!"(Btelnet $B$G@\B3$9$k;~$N%R%s%H$rI=<($9$k!#(B

    $B%5!<%P$N%W%m%0%i%`$NFCD'$O!"FbIt$KL58B%k!<%W$r;}$C$F$$$k$3$H$G$"$k!#(B $B%5!<%P$O!"IaDL$N>uBV$G$O!"=*N;$7$J$$!#(B

    accept() $B$O!"@\B3MW5a$rBT$D%a%=%C%I$G$"$k!#%/%i%$%"%s%H$+$i@\B3$,Mh$k(B $B$^$G!"%7%9%F%`%3!<%k$r

    tcp_peeraddr_print() $B$O!"DL?.Aj

    $B0J8e$N;E;v$O!"(BEchoServerWorker $B$H$$$&%/%i%9$N%*%V%8%'%/%H$r:n@.$7$F9T(B $B$o$;$F$$$k!#%3%s%9%H%i%/%?$G$O!"(BSocket $B%/%i%9$N%*%V%8%'%/%H$rEO$7$F$$(B $B$@$1$G$"$j!"

      34:	    public static void print_my_host_port( int portno ) throws UnknownHostException
      35:	    {
      36:	        InetAddress ia = java.net.InetAddress.getLocalHost();
      37:	        String hostname = ia.getHostName();
      38:	        stdout.println("run telnet "+hostname+" "+portno );
      39:	    }
      40:	    public static void tcp_peeraddr_print( Socket com )
      41:	    {
      42:	        InetSocketAddress isa = (InetSocketAddress)com.getRemoteSocketAddress();
      43:	        InetAddress ia = isa.getAddress();
      44:	        String peerhostaddr = ia.getHostAddress();
      45:	        int peerportno = isa.getPort();
      46:	        stdout.println("connection (hash=="+com.hashCode()+") from "+peerhostaddr+":"+peerportno );
      47:	    }
    

    print_my_host_port() $B$H(B tcp_peeraddr_print() $B$O!"$=$l$>$lF1$8F1L>$N#C(B $B$N4X?t$HF1$8F/$-$r$9$k!#(B

       1:	/*
       2:	        EchoServerWorker.java -- $BJ8;zNs$rAw
    
    echo$B%5!<%S%9$N%/%i%$%"%s%H(B
    $B$HF1MM$K!"(BSocket $B$+$i(B BufferedReader $B$H(B PrintStream $B$r@8@.$7$F$$$k!#(B
    $B$=$7$F!"(BreadLine() $B$d(B println() $B$K$h$jDL?.$r9T$C$F$$$k!#(B
    
    

    $B%9%l%C%I$K$h$kJ#?t$N%/%i%$%"%s%H$KBP$9$k%5!<%S%9$NF1;~Ds6!(B(Java$BHG(B)

    $B$o$:$+$J=$@5$G!"%9%l%C%IBP1~$K$J$j!"J#?t$N%/%i%$%"%s%H$KBP$7$F%5!<%S%9(B $B$rF1;~$KDs6!$G$-$k$h$&$K$J$k!#(B
     % diff -c EchoServerSingle.java EchoServer.java
     *** EchoServerSingle.java       Sun May  9 20:01:50 2004
     --- EchoServer.java     Sun May  9 19:59:33 2004
     ***************
     *** 1,13 ****
       /*
     !       EchoServerSingle.java -- $BJ8;zNs$rAw
    
    
    

    $BN}=,LdBj(B

    $BN}=,LdBj(B(47) $B%>%s%S$N8zN(E*$J>C5n(B

    echo-server-fork-fdopen.c $B$G$O!"(Baccept() $B$7$F$$$kESCf$G!";R%W%m%;%9$,=*N;$9$k$H%>%s%S$K$J$C$F$7(B $B$^$&!#;R%W%m%;%9$,=*N;$7$?$iD>$A$K%>%s%S$r2s<}$9$k$h$&$K$7$J$5$$!#(B

    $B%R%s%H!';R%W%m%;%9$N=*N;$r!"%=%U%H%&%'%"3d$j9~$_(B(signal, SIGCHLD)$B$GCN(B $B$kJ}K!$b$"$k!#J#?t$N;R%W%m%;%9$,=*N;$7$F$b!"3d$j9~$_$O#12s$7$+5/$3$i$J(B $B$$$3$H$,$"$k$3$H$KCm0U$7$J$5$$!#(B

    $B%=%U%H%&%'%"3d9~$_$r;H$&$H!"(Baccept() $B%7%9%F%`%3!<%k$,%(%i!<$GLa$C$FMh(B $B$k%7%9%F%`$b$"$k!#$=$N>l9g!"%(%i!

    $BN}=,LdBj(B(48) SO_REUSEADDR

    $B%5!<%P$r % ./echo-server-fork 1231 [$B bind: Address already in use port number 1231 is already used. wait a moment or kill another program. % []
    $B$3$N%(%i!<$O!"l9g!"uBV$,4KOB$5$l$k$3$H$,$"$k!#(B
    setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, 0, 0);
    
    $B$3$N8z2L$r3N$+$a$J$5$$!#(B

    $B$^$?!"F1$8%]!<%HHV9f$N:FMxMQ$r@)8B$7$F$$$kM}M3$r9M$($J$5$$!#(B

    $BN}=,LdBj(B(49) DoS$B967bBP:v(B

    echo-server-selec.c$B$K4^$^$l$F$$$k(B \n $B$rAw$i(B $B$J$$$3$H$K$h$k(BDoS$B967b(B$B$K6/$/$J$k$h$&$K!"2~NI$7$J$5$$!#(B

    $BN}=,LdBj(B(50) poll() $B$NMxMQ(B

    System V $B7O$N(B Unix $B$K$O(B select() $B%7%9%F%`%3!<%k$,$J$/(B poll() $B%7%9%F%`%3!<%k$@$1$,B8:_$9$k$3$H$,$"$k!#(B echo-server-selec.c$B$r(B poll() $B%7%9%F%`%3!<%k$r;H$C$F=q$-49$($J$5$$!#(B

    $BN}=,LdBj(B(51) TCP/IP$B$N%9%H%j!<%`$H(Bpipe()(1)

    pipe() $B$NBe$j$K!"(BTCP/IP $B$N%9%H%j!<%`$r;H$C$F!"0[$J$k%[%9%H>e$N%W%m%;%9(B $B$r@\B3$7$F!"%U%#%k%?$N=hM}$r9T$o$;$F$_$J$5$$!#(B

    $B%W%m%0%i%`$r#1$D$@$1:n$k$N$G$O$J$/!"(Btcp_connect() $B$r$9$k$b$N$H(B tcp_acc_port() $B$r$9$k$b$N$N#2$D$r:n$k$H$h$$!#(Btcp_acc_port() $B$r$9$kB&$G(B $B$O!"(Bfork() $B$r$7$F!"J#?t$N%/%i%$%"%s%H$KBP1~$9$k$N$G$O$J$/!"DL(B $B?.MW5a

    $B$3$N2]Bj$G$O!"(Bfork() $B$O!"$7$J$/$F$b$h$$!#%Q%$%W$O!"(Bfork() $B$G$G$-$??F;R(B $B4X78$N$"$k%W%m%;%94V$GDL?.$r9T$&$b$N$G$"$k$,!"(BTCP/IP$B$G$O!"?F;R4X78$,$J(B $B$$%W%m%;%94V$GDL?.$,$G$-$k!#(B

    TCP/IP $B$J$iK\MhAPJ}8~$G;H$($k!#$7$+$7!"$3$NN}=,LdBj$@$HC1J}8~$@$1$r;H(B $B$&!#$3$&$9$k$H!"%Q%$%W$HF1$8$h$&$J;H$$J}$,$G$-$k!#(B

    $BN}=,LdBj(B(52) TCP/IP$B$N%9%H%j!<%`$H(Bpipe()(2)

    $BN}=,LdBj(B(51) $B$G!"#3$D0J>e$N%W%m%;%9$r@\B3$G$-$k$h$&$K$7$J$5$$!#(B

    $B%W%m%0%i%`$r#1$D$@$1:n$k$N$G$O$J$/!"@hF,MQ!"Cf4VMQ!"KvHxMQ$N#3$D$r:n$k(B $B$H$h$$!#Cf4VMQ$N$b$N$O!"$&$^$/:n$k$H!"2?8D$G$b$O$5$_9~$a$k$h$&$K$J$k!#(B

    $BN}=,LdBj(B(53) TCP/IP$B$N%9%H%j!<%`$H(Bpipe()(3)

    $BN}=,LdBj(B(51) $B$^$?$O(B $BN}=,LdBj(B(52) $B$G!"30It$N%W%m%0%i%`$r

    $B%R%s%H!'(Bdup(), dup2(), close() $B$J$I$G!"I8=`F~=PNO$r@Z$jBX$($F!"(B execve() $B$J$I$G!"%W%m%0%i%`$r

    $B$?$H$($P!"%7%'%k$K % command1 | command2 | command3 [$B

    $B$3$N;~!"%7%'%k$O!"(Bfork() $B$7$J$,$i#2$D$N%Q%$%W$G#3$D$N%W%m%;%9$r7k$S!"(B execve() $B$J$I(B command1, command2, command3 $B$r

    $B$3$N2]Bj$G$O!"(Btcp_accept() $BB&$G(B fork() $B$r9T$&I,MW$O$J$$!##12s$N%3%^%s(B $B%I$r

    $BN}=,LdBj(B(54) IP$B%"%I%l%9$r%[%9%HL>$K5UJQ49$9$k(B

    $B>e$N(B tcp_peeraddr_print() $B$O!"(BIP $B%"%I%l%9$r?t;z$GI=<($7$F$$$?!#(B $B$3$l$r!"%[%9%HL>$GI=<($9$k$h$&$K$7$J$5$$!#(B

    $BN}=,LdBj(B(55) localhost

    telnet $B$G@\B3@h$H$7$F(B localhost (127.0.0.1) $B$r;XDj$9$k$H$I$&$J$k$+!#(B localhost $B$O!"$I$N%[%9%H$+$i$b<+J,<+?.$r;X$9L>A0$G$"$k!#(B

    $BN}=,LdBj(B(56) http$B%5!<%P(B

    http $B%5!<%P$r:n@.$7$J$5$$!#$3$l$O!"$N%U%!%$%k$r(B fopen() $B$7$F!"FbMF$r(B fread() $B$7!"$=$l$r@\B3@h$K(B fwrite() $B$GJV$9$h$&$K(B $B$9$k$H$h$$!#(B

    $B$3$N2]Bj$G$O!"FC$K%;%-%e%j%F%#$K5$$r$D$1$J$5$$!#I,$:r7o$rK~$?$9$h(B $B$&$J%5!<%P$r:n$j$J$5$$!#(B

    • $BFCDj$N%G%#%l%/%H%j(B($B$?$H$($P(B ~/public_html)$B0J2<$N%U%!(B $B%$%k$7$+%"%/%;%9$G$-$J$$$h$&$K$9$k$3$H!#$=$l$K$O!"%U%!%$%k$r3+$/(B (open(), fopen())$B;~$K!"F,$K4D6-JQ?t(B HOME $B$NCM$H(B "/public_html" $B$rIU2C(B $B$9$kJ}K!$,$"$k!#!JB>$NJ}K!$b$"$k!#!K$J$*!"(B~ $B$O!"(Bopen() $B%7%9%F%`!&(B $B%3!<%k$d(B fopen() $B%i%$%V%i%j4X?t$G$O;H$($J$$!#(B~ $B$O!"%7%'%k$d(B emacs $B$,FH<+$K%[!<%`!&%G%#%l%/%H%j$rD4$Y$FCV$-49$($F$$$k!#(B
    • $B%U%!%$%kL>$K!"(B.. $B$,4^$^$l$F$$$?$i!"%"%/%;%9$r5qH]$9$k$3$H!#(B .. $B$O!"#1$D>e$N%G%#%l%/%H%j$r0UL#$9$k!#(B.. $B$r5v$;$P!"(B ~/public_html $B0J30$N>l=j!"$?$H$($P!"(B ../Mail $B$G!"EE;R%a!<%k$,Ep$^$l$k4m81@-$,$"$k!#(B
    • $B%U%!%$%kL>$K!"(B < $B$,4^$^$l$F$$$?$i!"%"%/%;%9$r5qH]$9$k(B $B$3$H!#FC$K!"$=$NJ8;z$r%/%i%$%"%s%H$K$=$N$^$^JV$9$H4m81$G$"$k!#(B $B30$+$i(B JavaScript $B$J$I$N$h$&$J%9%/%j%W%H8@8l$rAw$j9~$^$l$F!"(B $B$"$?$+$b0BA4$J%5%$%H$+$iAw$i$l$?$+$N$4$H$/ $B%U%!%$%k$,B8:_$9$l$P!"(B200 OK $B$r!"%U%!%$%k$,B8:_$7$J$1$l$P!"(B 404 Not Found $B$rJV$9!#(B
    • $B%U%!%$%k$,B8:_$9$k>l9g!" Content-Type: $B3HD%;R(B text/html .html text/plain .txt image/gif .gif image/jpeg .jpeg image/png .png
    $B3XN`Fb$N7W;;5!$+$i$N@\B3MW5a$@$1$r$^$7$$(B ($B$3$N5!G=$O!"I,?\$G$O$J$$(B)$B!#%/%i%$%"%s%H$N(BIP$B%"%I%l%9$r(B getpeername() $B$GD4$Y!"(B130.158.86.0-130.158.87.255 $B$NHO0O$K$D$$$F$N$_%"%/%;%9$r5v2D$9(B $B$k$h$&$K$9$k!#(B

    ~yas/syspro/ipc/http-server.c $B$K!">o$KF1$8FbMF$rJV$9(Bhttp $B%5!<%P$,$"$k!#(B $B$3$l$r=PH/E@$K$7$F$b$h$$!#$=$N>l9g!"

  • requestline $B$r2r@O$7!"%U%!%$%kL>$r $BM?$($i$l$?%U%!%$%kL>$+$i!"(BHTTP $B$N1~Ez$N%X%C%@$r2hLL$KI=<($9$k4X?t(B $B$rC1BN$G3+H/$9$k!#(B
  • 1. $B$+$i(B 2. $B$r(B http-server.c $B$K#1$D$:$DAH$_9~$`!#(B $BBg$-$J%W%m%0%i%`$O!">.$5$JItIJ$KJ,2r$7$FFHN)$7$F3+H/$9$k$3$H$,Bg;v$G$"(B $B$k!#(B

    $B$C$F$$$k$+3NG'$G$-$J$$$N$G!"IT==J,(B $B$G$"$k!#(B

    $BN}=,LdBj(B(57) $BJ#?t$N%/%i%$%"%s%H$+$iMW5a$r

    $BN}=,LdBj(B(56) $B$G!"J#?t$N%/%i%$%"%s%H$+$iF1;~$K@\B3$re$N%/%i%$%"%s%H$+$i$NMW(B $B5a$r@)8B$9$k$h$&$K$7$J$5$$!#(B

    $BN}=,LdBj(B(58) $BJ#?t$N%/%i%$%"%s%H$+$iMW5a$r

    $BN}=,LdBj(B(56) $BJ#?t$N%/%i%$%"%s%H$+$iF1;~$K@\B3$rl9g!"#2$D$N@\B3$^$GF1;~$K=hM}$r9T$&$,!"#3$D$a(B $B$,Mh$?>l9g!"@\B3$r@Z$k$+B>$N@\B3$,JD$8$i$l$k$^$G=hM}$rCY1d$9$k!#(B

    $BN}=,LdBj(B(59) finger$B%5!<%P(B

    finger $B%5!<%P$r:n@.$7$J$5$$!#$3$l$O!"

    finger $B%3%^%s%I$N%W%m%;%9$H(B finger $B%5!<%P$N4V$O!"%Q%$%W$G@\B3$7$J$5$$!#(B $B:#$^$G$NNcBj$GMxMQ$7$?J}K!$rAH$_9g$o$;$k$3$H$G

    finger $B%3%^%s%I$N%W%m%;%9$H(B finger $B%5!<%P4V$r%Q%$%W$G7k$VBe$o$j$K!"(B finger $B%3%^%s%I$r(B exec $B$9$kA0$K!"G[4I9);v$r$7$F!"I8=`=PNO(B(1)$B$r(BTCP/IP$B$N(B $B%9%H%j!<%`$K@\B3$9$kJ}K!$b$"$k!#(B

    $Bl9g$K$O!"(B finger $B%3(B $B%^%s%I$,

    fork() $B$d(B execve() $B$rMQ$$$FD>@\(B /usr/bin/finger $B$r

    getpwnam() $B%i%$%V%i%j4X?t$d(B utmp $B%U%!%$%k$rMQ$$$F!"(Bfinger $B%3%^%s%I$H;w$?$h$&$J(B $BF0$-$r

    $BN}=,LdBj(B(60) HTTP Proxy

    HTTP proxy $B:n$j$J$5$$!#eIU$1$J$5$$!#(B

    • $B%"%/%;%9@)8f!#FCDj$N%[%9%H$+$i$7$+$D$J$,$i$J$$$h$&$K$9$k!#(B
    • $B%U%#%k%?%j%s%0!#FbMF$N2C9)$r9T$&!#(B
    • $B%-%c%C%7%s%0!#0lEY%5!<%P$+$iF@$?FbMF$r%U%!%$%k$KJ]B8$7!"(B $B#22sL\$+$i$O$=$l$r;H$&!#(B

    $BN}=,LdBj(B(61) $B%5!<%P<+M32]Bj(B

    $B$=$NB>!"(Bhttp$B%5!<%P!"(Bfinger$B%5!<%P!"$^$?$O!"(BHTTP Proxy $B$HF1DxEY0J>e$NJ#(B $B;($5$r;}$D%5!<%P$r:n@.$7$J$5$$!#(B
    Last updated: 2005/06/25 00:49:04
    Yasushi Shinjo / <yas@is.tsukuba.ac.jp>