【问题标题】:Ocaml comparison not workingOcaml比较不起作用
【发布时间】:2016-01-22 05:31:54
【问题描述】:

我正在尝试在 Ocaml 中编写一个简单的服务器程序,该程序通过套接字与其他进程通信。我目前有一个问题,服务器读取的字符串(使用input_line ic)似乎无法正确地与其他字符串进行比较。例如,我运行服务器程序并使用 telnet 连接到它,如果我将“end”作为一行发送,服务器程序会尝试与“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 中的错误吗?
  • 您需要完整的源代码来解决这个问题吗?

【问题讨论】:

    标签: sockets ocaml


    【解决方案1】:

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

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

    您不太可能在 OCaml 中看到错误。

    【讨论】:

    • 那个!我曾想过(并为此做了一点)包括换行的 telnet,但出于某种原因,我没有想到回车。
    猜你喜欢
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 2013-08-27
    • 1970-01-01
    相关资源
    最近更新 更多