gpt4 book ai didi

sockets - Ocaml比较不起作用

转载 作者:行者123 更新时间:2023-12-03 11:59:53 24 4
gpt4 key购买 nike

我正在尝试在 Ocaml 中编写一个简单的服务器程序,该程序通过套接字与其他进程通信。我目前有一个问题,服务器读取的字符串(使用 input_line ic )似乎无法正确地与其他字符串进行比较。例如,我运行服务器程序并使用 telnet 连接到它,如果我将“end”作为一行发送,服务器程序会尝试与“end”匹配,但这并没有按预期工作。处理通信的函数是service (如下),它被调用来将客户端作为 fork 服务器的一部分来处理(类似于双 fork 处理 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 block 之间不同比较操作的结果:
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)) ;
当我发送“结束”时,服务器现在打印出来

end

end

false

false

-1


我真的不知道会发生什么——我想这一定是关于获得 instr 的事情。通过从套接字读取,通常您可以很好地比较字符串。
我认为我实际上在所有这些背景下都没有问题,所以这里有一些可行的变体:
  • 我究竟做错了什么?
  • 为什么我不能测试输入以采取不同的行动?
  • 这是 Ocaml 中的错误吗?
  • 你需要完整的来源来解决这个问题吗?
  • 最佳答案

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

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

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

    关于sockets - Ocaml比较不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34939647/

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