#!/usr/local/bin/tt

# 簡易 UDP Echo クライアントです。
# UDP 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メッセージ               （文字列）

# ソケットの作成  （ソケット情報の確認表示用）
	sock = udp_socket()
    if( sock==NULL )
        dying("UDP %s<Client>%s Error: cannot make UDP socket!!\n",C_RED,C_DEF)
	disp_sockinfo(sock)

# メッセージの送信（デフォルトソケット sock を利用）
    ret = tx_udp(ip,port,msg)
	disp_sockinfo(sock)
	print("UDP %s<Client>%s ",C_RED,C_DEF)
    print("%sSend To  :%s IP=%s Port=%5d Message=\"%s\"(Length=%d)\n",C_GRE,C_DEF,ip2str(ip),port2int("udp",port),msg,ret)

# メッセージの受信（デフォルトソケット sock を利用）
    (ip,port,msg,len) = rx_udp()
	disp_sockinfo(sock)
	print("UDP %s<Client>%s ",C_RED,C_DEF)
    print("%sRecv From:%s IP=%s Port=%5d Message=\"%s\"(Length=%d)\n",C_GRE,C_DEF,ip2str(ip),port2int("udp",port),msg,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("UDP ${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);
	}

}
