システムプログラム02-ver01_server

「システムプログラム02-ver01_server」の編集履歴(バックアップ)一覧はこちら

システムプログラム02-ver01_server」(2010/07/13 (火) 21:00:12) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

/* * ポート番号9000を使用する */ #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #define NSTRS 3 /* 文字列の個数 */ #define STRMAX 10 char *strs[NSTRS]; char *tmp; char *root; extern int errno; int main(int ac, char *av[]){ char c; FILE *fp; FILE *tfp; int fromlen; char hostname[64]; struct hostent *hp; register int i,s,ns; struct sockaddr_in sin, fsin; printf(">> server run\n"); /* * 何はともあれ、ホストネームを取得 */ gethostname(hostname,sizeof(hostname)); /* * ホストネームのネットワーク番号を取得 */ if((hp=gethostbyname(hostname))==NULL){ fprintf(stderr,"%s: unknown host.\n", hostname); exit(1); } fprintf(stderr,">> hosting : %s\n", hostname); /* * ソケットを取得、このソケットはインターネットドメインで、ストリーム型 */ if((s=socket(AF_INET,SOCK_STREAM,0))<0){ perror("clisent: socket"); exit(1); } /* アドレス構造体を作成する。ここではポート番号 9000を * 使用する */ sin.sin_family=AF_INET; sin.sin_port=htons(9000); /* * bcopy(hp->h_addr,&sin.sin_addr,hp->h_length); * の代わりに、以下の INADDR_ANY を用いる */ sin.sin_addr.s_addr=htonl(INADDR_ANY); /* * アドレスとソケットを対応づける */ if(bind(s,(struct sockaddr*)&sin,sizeof(sin))<0){ perror("server: bind"); exit(1); } /* * ソケットを通じて、サービス要求があるかどうか待機する */ if(listen(s,5)<0){ perror("server:listen"); exit(1); } /* * サービス要求があれば、それを受理して、接続を確立する。 * 通信路を確立すると、ファイルディスクリプタ ns は * クライアント側と繋がったものになる。 * fsinにはクライアント側のアドレスが格納される。 */ if((ns=accept(s,(struct sockaddr*)&fsin, &fromlen)) <0){ perror("server:accept"); exit(1); } /* * ソケット経由で、ファイルを読み出すファイルポインタ */ fp=fdopen(ns,"r"); /* * クライアントから文字列をstrs[i]に読み出す */ printf(">> text from client\n"); for(i=0;i<NSTRS;i++){ strs[i]=malloc(STRMAX); fgets(strs[i],STRMAX,fp); printf("%s",strs[i]); } /* * 変換を行う */ for(i=0;i<NSTRS;i++){ tmp=malloc(STRMAX); strcpy(tmp,strs[i]); strs[i]=malloc(STRMAX); root=strs[i]; while(*tmp!='\n'){ if(('A'<=*tmp)&&(*tmp<='Z')){*tmp=*tmp+32;} else if(('a'<=*tmp)&&(*tmp<='z')){*tmp=*tmp-32;} *strs[i]=*tmp; strs[i]++;tmp++; } *strs[i]='\n'; strs[i]=root; } /* * 文字列をクライアントに送る */ printf(">> send to client\n"); for(i=0;i<NSTRS;i++){ printf(strs[i]); send(ns,strs[i],strlen(strs[i]),0); } /* * ここで単に close() を呼び出して、接続を切る */ close(s); exit(0); }

表示オプション

横に並べて表示:
変化行の前後のみ表示: