#!/usr/local/bin/tt

# 簡易 TCP Echo クライアントです。
# TCP Echo サーバーに接続し、メッセージを送信し、サーバーからの送信（返答）メッセージを受信します。

/*--1---2---3---4---5---6---7---8---9---A---B---C---D---E---F---G---H---I---J---K---L---M---N---*/

# 引数の確認
    if( argc!=4 )
        dying("使い方:  %s  (Server)IPアドレスorホスト名  (Server)ポート番号orサービス名  Echoメッセージ\n",CMD)

# サーバー情報とメッセージの取得
    ip   = shift()                      # IPアドレス、又は、ホスト名  （文字列）
    port = shift()                      # ポート番号、又は、サービス名（文字列）
    msg  = shift()                      # UDPメッセージ               （文字列）

# TCP 接続        （デフォルトソケット TCP_SOCKET を利用）
    ret = connect(ip,port)
    if( ret==NULL )
        dying("TCP %s<Client>%s Error: cannot connect to TCP server!!\n",C_RED,C_DEF)
	disp_sockinfo(TCP_SOCKET)

# メッセージの送信（デフォルトソケット TCP_SOCKET を利用）
    ret = tx_tcp(msg)
	disp_sockinfo(TCP_SOCKET)
    print("TCP %s<Client>%s %sSend To  :%s Message=\"%s\"(Length=%d)\n",C_RED,C_DEF,C_GRE,C_DEF,msg,ret)

# メッセージの受信（デフォルトソケット TCP_SOCKET を利用）
    (buf,len) = rx_tcp()
	disp_sockinfo(TCP_SOCKET)
    print("TCP %s<Client>%s %sRecv From:%s Message=\"%s\"(Length=%d)\n",C_RED,C_DEF,C_GRE,C_DEF,buf,len)

# ソケット情報を、初回時及び変化時のみ表示する。
def disp_sockinfo(sock){

static flag_init=TRUE
static lo_ip,lo_port,lo_type,ro_ip,ro_port,ro_type

	# ソケット情報の読み込み
	(lx_ip,,lx_port,,lx_type,rx_ip,,rx_port,,rx_type) = sockinfo(sock)

	# 変化の検出
	if( flag_init || lo_ip!=lx_ip || lo_port!=lx_port || lo_type!=lx_type \
				  || ro_ip!=rx_ip || ro_port!=rx_port || ro_type!=rx_type )
		flag_disp=TRUE

	# 表示＆FIFO
	if( flag_disp ){
		flag_init=FALS
		lo_ip=lx_ip; lo_port=lx_port ; lo_type=lx_type
		ro_ip=rx_ip; ro_port=rx_port ; ro_type=rx_type
		print("TCP ${C_RED}<Client>${C_YEL} Sock=%d ",sock)
    	print("[Loc]IP=%s/Port=%5s/Type=%s "         ,lo_ip==NULL?"(null)":ip2str(lo_ip),str(lo_port),lo_type)
    	print("[Rem]IP=%s/Port=%5s/Type=%s${C_DEF}\n",ro_ip==NULL?"(null)":ip2str(ro_ip),str(ro_port),ro_type);
	}

}
