Ocaml比较不起作用

时间:2016-01-22 05:31:55

标签: sockets ocaml

我正在尝试在Ocaml中编写一个简单的服务器程序,它通过套接字与其他进程通信。我目前有一个问题,即服务器读取的字符串(input_line ic)似乎没有正确地与其他字符串进行比较。例如,我运行服务器程序并使用telnet连接到它,如果我发送"结束"作为一行,服务器程序试图与" end"匹配,但这并不像预期的那样工作。处理通信的函数是service(下面),它被称为处理客户端作为分叉服务器的一部分(类似于双叉处理here)。

let service ic oc
    try while true do
        let instr = input_line ic in
        match instr with
        | "end" -> print_endline "matching end" (* this never runs *)
        | _ -> output_string oc ((String.uppercase instr) ^ "\n") ; flush oc
    done
    with End_of_file -> print_endline "Input stream ended."
;;

事实上,如果我做print_endline (string_of_bool ("end" = instr))我总是假的(即使我发送"结束"通过telnet)。为了尝试了解将要发生的事情,我打印出let-binding和try块之间不同比较操作的结果:

print_endline instr ;
print_endline "end" ;
print_endline (string_of_bool ("end" = instr)) ;
print_endline (string_of_bool ("end" == instr)) ;
print_endline (string_of_int (String.compare "end" instr)) ;

当我发送"结束"服务器现在打印出来

  

     

     

     

     

-1

我真的迷失了可能发生的事情 - 我认为它必须是通过从套接字读取来获取instr,因为通常你可以比较字符串就好了。

我不认为我在所有背景中确实有一个问题,所以这里有一些可行的变体:

  • 我做错了什么?
  • 为什么我无法测试输入以采取不同的操作?
  • 这是Ocaml中的错误吗?
  • 你需要完整的资料来解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

我的猜测是来自telnet的字符串中有回车符。我记得,旧的协议倾向于在行的末尾发送CRLF。

您可以尝试使用String.escaped打印字符串。

您很难看到OCaml中的错误。