2017-01-01 2 views
2

Я пытаюсь создать очень простой http-сервер с модулем Unix низкого уровня , чтобы лучше понять, как работает HTTP-сервер. Это мой текущий код:ocaml упрощающий HTTP-сервер с модулем Unix

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; 

Когда я открываю WebBrowser & прибой в localhost:8888 программа отображает символ новой строки и завершает работу. Почему он не распечатывает запрос?

Согласно документации Unix модуля recv имеет следующую подпись:

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

Что смысл ... -> int -> int -> ...? Я понятия не имею, что я должен пропустить в этих двух ints.

Также, как я могу узнать, какой размер a должен дать bytes?

ответ

2

Часть ответа заключается в отображении C recv (sendrecv: .opam/версия /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.

С новым годом в любом случае;)

+0

ли вам подумайте, что нужно довести до сведения общественности, что в таких модулях отсутствует элементарная документация? – RichouHunter

+1

может быть да ... но я не знаю, какой из них лучше всего подходит: может быть, предлагая прямое повышение doc на github. –

+0

Спасибо за ответ! Я понимаю это сейчас, и счастливый новый год: D – Seneca

Смежные вопросы