From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from majordomo@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id WAA25412; Fri, 22 Nov 2002 22:51:50 +0100 (MET) X-Authentication-Warning: pauillac.inria.fr: majordomo set sender to owner-caml-list@pauillac.inria.fr using -f Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id WAA25530 for ; Fri, 22 Nov 2002 22:51:49 +0100 (MET) Received: from wg.pu.ru (wg.pu.ru [193.124.85.219]) by concorde.inria.fr (8.11.1/8.11.1) with ESMTP id gAMLpmX12281 for ; Fri, 22 Nov 2002 22:51:49 +0100 (MET) Received: from farlight.localdomain (p140.ppp.pu.ru [194.85.123.140]) by wg.pu.ru (8.9.1a/8.9.1) with ESMTP id VAA11209; Fri, 22 Nov 2002 21:51:46 GMT Received: by farlight.localdomain (Postfix, from userid 1000) id E8BB4BFFC; Sat, 23 Nov 2002 00:43:10 +0300 (MSK) Date: Sat, 23 Nov 2002 00:43:10 +0300 To: "altavillasalvatore@libero.it" Cc: caml-list@inria.fr Subject: Re: [Caml-list] Unix.sendto Unix.recvfrom Message-ID: <20021122214310.GA1352@dt7463.spb.edu> References: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="6TrnltStXW4iwmi0" Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.3.28i From: dt@dt7463.spb.edu (Dimitri Timofeev) Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk --6TrnltStXW4iwmi0 Content-Type: text/plain; charset=koi8-r Content-Disposition: inline Hi! On Fri, 22 Nov 2002, altavillasalvatore@libero.it wrote: > I would want to have an example of like sending and receiving a > package (type string) in ocaml via UDP protocol Maybe an attached file (an exercise) could help you. By the way, i'd like to hear all the criticism and suggestions one may have concerning this code. -- Dimitri --6TrnltStXW4iwmi0 Content-Type: text/plain; charset=koi8-r Content-Disposition: attachment; filename="client.ml" (* * 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 () ;; --6TrnltStXW4iwmi0-- ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners