Version française
Home     About     Download     Resources     Contact us    
Browse thread
[Q] About Unix Library of Ocaml
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Xavier Leroy <Xavier.Leroy@i...>
Subject: Re: [Q] About Unix Library of Ocaml
> 1) Why do these exceptions occur ?
> # let theSocket = socket PF_INET SOCK_RAW 0 ;;
> Uncaught exception: Unix.Unix_error(1, "socket", "")
> # let theSocket = socket PF_INET SOCK_SEQPACKET 0 ;;
> Uncaught exception: Unix.Unix_error(45, "socket", "")

The best way to interpret those mysterious error codes is to use the
Unix.error_message function to get a readable error message.  Let's do
that as a generic error reporting function:

# let show_unix_error fn =
      fn ()
    with Unix_error(err, ctx1, ctx2) as exn -> 
      Printf.printf "Unix error: %s, %s, %s" (error_message err) ctx1 ctx2;
      raise exn;;

Now, the errors you get are nearly self-explanatory:

# show_unix_error (fun () ->  socket PF_INET SOCK_RAW 0);;
Unix error: Operation not permitted, socket, 
Uncaught exception: Unix.Unix_error(30, "socket", "")
# show_unix_error (fun () ->  socket PF_INET SOCK_SEQPACKET 0);;
Unix error: Socket type not supported, socket, 
Uncaught exception: Unix.Unix_error(46, "socket", "")

In other terms, the SEQPACKET socket type is not supported by your
Unix kernel, and you need to be superuser to create a socket in RAW

> 2) What is the differences of 4 socket_type ?
>  Stream socket, Datagram socket, Raw socket, Sequenced packets socket

This question, as well as your other questions, is a question about
Unix network programming, not about Caml.  The "Unix" library in Caml
is a direct translation of the basic Unix systems programming concepts.
Please refer to any good book on Unix systems programming, such as
the books by W. Richard Stevens ("Advanced Programming in the Unix
Environment", "Unix Network Programming", etc).

> 3) Error with using connection function  
> # let addr = inet_addr_of_string "***.***.***.***" ;;
> val addr : Unix.inet_addr = <abstr>
> # let socketAddr = ADDR_INET( addr , 21 ) ;;
> val socketAddr : Unix.sockaddr = ADDR_INET (<abstr>, 21)
> # let theSocket = socket PF_INET SOCK_STREAM 0 ;;
> val theSocket : Unix.file_descr = <abstr>
> # connect theSocket socketAddr ;;
> Uncaught exception: Unix.Unix_error(63, "connect", "")
>  Could you let me know the error code(63)
>  and why does this error occur? 

Again, using the show_unix_error above, you'd see that the error is
"No route to host", and it means that the machine with the specified
IP address is not accessible from your machine.

> 4) Where can I get more specific information(examples, docs, papers) 
>   about ocaml library especially unix library 
>   (in order to design & implement bigger network library of ocaml 
>    for building web-server, web-browser etc... )

The books I mentioned above are an excellent starting point.  Once
you're familiar with Unix systems programming in general, you should
have no problems using the "Unix" library.

Best regards,

- Xavier Leroy