/*                                                  */
/* コネクション型クライアントプログラム (daytimecl.c) */
/*   Usage: hellocl host_name                       */
/*                                                  */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>


#define PROT_NO	13		/* ポート番号 */
#define BUF_MAX	64		/* 通信バッファサイズ */


/* クライアントメイン */
int main(int argc, char	*argv[])
{
	char buf[BUF_MAX];			/* 通信バッファ */
	int	rtn;					/* 返却値 */
	int	sid;					/* ソケット識別子 */
	struct hostent *hostent;	/* サーバIPアドレス */
	struct sockaddr_in	saddr;	/* サーバアドレス */


	/* コネクション型ソケットの作成 (socket) */
	sid = socket(AF_INET, SOCK_STREAM, 0);							/* <============================== SOKET */
	if (sid < 0)
	{
		perror("cl:socket");
		exit(1);
	}

	/* サーバのＩＰアドレスを取得 */
	hostent = gethostbyname(argv[1]);
	if (hostent == NULL)
	{
		perror("cl:gethostbyname");
		herror();
		exit(1);
	}

	/* ソケットの接続要求 (connect) */
	bzero((char *)&saddr, sizeof(saddr));
	saddr.sin_family = AF_INET;
	saddr.sin_port = htons(PROT_NO);
	memcpy((char *)&saddr.sin_addr, (char *)hostent->h_addr,hostent->h_length);
	rtn = connect(sid,(struct sockaddr*)&saddr, sizeof(saddr));		/* <==================== CONNECT */
	if (rtn < 0)
	{
		perror("cl:connect");
		close(sid);
		exit(1);
	}

	/* メッセージ通信処理 (send/recv) */
	while((rtn = recv(sid, buf, BUF_MAX, 0))>0)						/* <==================== RECEIVE */
	{
		buf[rtn]='\0';
		printf("%s\n", buf);
	}
	if (rtn < 0) perror("cl:recv");

	/* ソケットの開放 (shutdown/close) */
	rtn = shutdown(sid, 2);											/* <==================== SHUTDOWN */
	if (rtn < 0) perror("cl:shutdown");
	close(sid);														/* <============================== CLOSE */

	exit(0);
}
