/*** 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");
}