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


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

/*
* ポート番号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);
}