关于套接字:带有Unix模块的ocaml简单HTTP服务器

ocaml simplistic http server with the Unix module

我正在尝试使用低级Unix模块制作一个非常简单的http服务器
以便更好地了解http服务器的实际工作方式。
这是我当前的代码:

1
2
3
4
5
6
7
8
let () =
   let socket_fd = Unix.socket Unix.PF_INET Unix.SOCK_STREAM 0 in
   let _ = Unix.bind socket_fd (Unix.ADDR_INET ((Unix.inet_addr_of_string"127.0.0.1"), 8888)) in
   let _ = Unix.listen socket_fd 1 in
   let (file_descr,sockaddr) = Unix.accept socket_fd in
   let b = Bytes.create 1024 in
   let _ = Unix.recv file_descr b 0 0 [Unix.MSG_PEEK] in
   print_endline b;

当我打开网络浏览器时


部分答案在于recv的C映射(sendrecv:.opam / version / build / ocaml / otherlibs / unix / sendrecv.c)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CAMLprim value unix_recv(value sock, value buff, value ofs, value len,
                         value flags)
{
  int ret, cv_flags;
  long numbytes;
  char iobuf[UNIX_BUFFER_SIZE];

  cv_flags = convert_flag_list(flags, msg_flag_table);
  Begin_root (buff);
    numbytes = Long_val(len);
    if (numbytes > UNIX_BUFFER_SIZE) numbytes = UNIX_BUFFER_SIZE;
    enter_blocking_section();
    ret = recv(Int_val(sock), iobuf, (int) numbytes, cv_flags);
    leave_blocking_section();
    if (ret == -1) uerror("recv", Nothing);
    memmove (&Byte(buff, Long_val(ofs)), iobuf, ret);
  End_roots();
  return Val_int(ret);
}

因此,第一个int是缓冲区内的偏移量,第二个int是检索的长度-您不应将其设置为0。

新年快乐;)