(* * client.ml * OCaml version of sample robocup client *) let message_length = 1024 ;; let resolve_host server = let server_addr = try Unix.inet_addr_of_string server with | Failure ("inet_addr_of_string") -> (Unix.gethostbyname server).Unix.h_addr_list.(0) in server_addr ;; let connect_soccerserver sockaddr = let sock = Unix.socket Unix.PF_INET Unix.SOCK_DGRAM 0 in Unix.bind sock (Unix.ADDR_INET (Unix.inet_addr_any, 0)); sock; ;; let port_of_sockaddr sockaddr = match sockaddr with | Unix.ADDR_UNIX (_) -> 0 | Unix.ADDR_INET (_, port) -> port ;; let send_message message sock servaddr = Unix.sendto sock message 0 (String.length message) [] servaddr; print_string ("send " ^ (string_of_int (port_of_sockaddr servaddr)) ^ " : " ^ message); flush stdout ;; (* receive_message sock *) let receive_message = let buf = ref (String.create message_length) in let recv_msg sock = let len, addr = Unix.recvfrom sock !buf 0 message_length [] in let answer = String.sub !buf 0 len in print_string ("recv " ^ (string_of_int (port_of_sockaddr addr)) ^ " : " ^ answer ^ "\n"); flush stdout; (answer, addr) in recv_msg ;; let select_loop sock sockaddr = let icfd = Unix.descr_of_in_channel stdin in let addr = ref sockaddr in while true do match Unix.select [icfd; sock] [] [] 1.0 with | [], [], [] -> () | fdl, [], [] -> if List.mem sock fdl then (let _, newaddr = receive_message sock in addr := newaddr); if List.mem icfd fdl then send_message ((input_line stdin) ^ "\n") sock !addr; | _ -> () done ;; let message_loop sock servaddr = try select_loop sock servaddr with | End_of_file -> print_string "terminate"; print_newline () ;; let default_host = "localhost" ;; let default_port = 6000 ;; let main () = print_string "simple robocup client"; print_newline (); try let argc = Array.length Sys.argv in let host = if argc < 2 then default_host else Sys.argv.(1) in let port = if argc < 3 then default_port else int_of_string Sys.argv.(2) in let sockaddr = Unix.ADDR_INET (resolve_host host, port) in let sock = connect_soccerserver sockaddr in print_string ("Connecting to " ^ host ^ ":" ^ (string_of_int port)); print_newline (); message_loop sock sockaddr; Unix.close sock with | Failure ("int_of_string") -> Printf.eprintf "%s: bad port number\n" Sys.argv.(2) | Not_found -> Printf.eprintf "%s: host not found\n" Sys.argv.(1) ;; let _ = main () ;;