/*** TCP Client ***/ #include <stdlib.h> #include <stdio.h> #include <ctype.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #define SERVICE_NAME "tcpinetd" #define PROTOCOL "tcp" #define HOST_NAME "nw0517.st.ie.u-ryukyu.ac.jp" /*ソケット接続をつなげて、サーバとコネクションをつなぐ準備をする*/ int Connect() { int SocketNumber; /* ソケットディスクリプタ(ソケットの識別子) */ struct servent *ServiceEntry; /* サービスのエントリ */ struct hostent *HostEntry; /* ホストのエントリ */ struct sockaddr_in sin; /* ソケットのエントリ */ /*サービス名からサービスのエントリを取得*/ if((struct servent *)NULL == (ServiceEntry = getservbyname(SERVICE_NAME,PROTOCOL))) { printf("\7No service [%s].\n",SERVICE_NAME); exit(1); } /*ホスト名からホストのエントリを取得 */ if((struct hostent *)NULL == (HostEntry = gethostbyname(HOST_NAME))) { printf("\7No Hosts [%s].\n",HOST_NAME); exit(1); } /* ソケットの取得 */ if(0 > (SocketNumber = (socket(AF_INET,SOCK_STREAM,0)))) { printf("\7Cannot get Socket.\n"); exit(1); } /* プロトコルのファミリーネームを設定 */ sin.sin_family = AF_INET; /*ホストのアドレスを設定 */ bcopy(HostEntry->h_addr,&sin.sin_addr,HostEntry->h_length); /* ポート番号を設定 */ sin.sin_port = ServiceEntry->s_port; if(0 > connect(SocketNumber,(struct sockaddr *)(&sin),sizeof(sin))) { printf("\7Cannot Connect.\n"); exit(1); } return SocketNumber; } /*ソケット接続を解除して、コネクションを切る*/ void Disconnect(int SocketNumber) { close(SocketNumber); } /*サーバにデータを送る*/ void SendData(int SocketNumber,char *line) { if(strlen(line) != write(SocketNumber,line,strlen(line))) { printf("\7Send Failed.\n"); exit(1); } } /*サーバからデータを受け取る*/ int RecvData(int SocketNumber,char *line) { int i; for(i = 0 ;;) { if(1 != read(SocketNumber,line + i,1)) continue; else { i++; *(line + i) = (char)0; if(((char)('\n')) == *(line + i - 1)) return i; } } } int main() { int Sock; char Key[256]; char Data[256]; char buff[256]; Sock = Connect(); /* 接続 */ printf("Connected.\n"); for(;;) { char *p; printf("Input Keyword = "); fflush(stdout); gets(Key); sprintf(buff,"%s=\n",Key); SendData(Sock,buff); /* データを送信 */ if(0 == strlen(Key)) break; /* もし終了したら */ /* ---- サーバの返事を待つ --- */ (void)RecvData(Sock,buff); /* データを受信 */ if((char *)NULL != (p = strchr(buff,'\n'))) *p = (char)0; if((char *)NULL != (p = strchr(buff,'='))) p++; printf("Keyword = [%s] / Data = [%s]\n\n",Key,p); } Disconnect(Sock); /* 接続解除 */ printf("Disocnnected.\n"); }