gpt4 book ai didi

sockets - 带有 Unix 模块的 ocaml 简单的 http 服务器

转载 作者:行者123 更新时间:2023-12-03 11:50:02 25 4
gpt4 key购买 nike

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

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;

当我打开网络浏览器并浏览到 localhost:8888 时,程序会显示一个换行和退出。为什么不打印请求?

根据 Unix 模块文档 recv 具有以下签名:

val recv : file_descr -> bytes -> int -> int -> msg_flag list -> int
Receive data from a connected socket.

... -> int -> int -> ... 是什么意思?我不知道我应该在这两个整数中传递什么。

另外我怎么知道应该给 bytes 什么大小?

最佳答案

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

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。

无论如何,新年快乐;)

关于sockets - 带有 Unix 模块的 ocaml 简单的 http 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41415756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com