tcp - 进程和 TCPSocket 在 Crystal 中没有正确关闭

标签 tcp process crystal-lang

我正在创建一个接受所有连接并执行传入数据的 tcp 服务器有命令行,但是当我向 tcpsocket 发送“退出”时,进程和套接字没有正确关闭

# main.cr

require "socket"

PORT = 2022

def handle_connection(socket)
  Process.run("/bin/sh", input: socket, output: socket, error: socket)
end

server = TCPServer.new(PORT)

loop do
  if socket = server.accept?
    spawn handle_connection(socket)
  else
    break
  end
end

例如,下面的代码工作正常,在向 STDIN 发送“exit”后,shell 退出,打印“process ending”并关闭程序

channel = Channel(Nil).new

spawn do
  Process.run("/bin/sh", input: STDIN, output: STDOUT, error: STDERR)
  puts "process ending"
  channel.send(nil)
end

channel.receive

出于调试目的,我也测试了这段代码,但在我手动关闭 tcp 套接字之前,“进程结束”从未打印过

# main.cr

require "socket"

PORT = 2022

def handle_connection(socket)
  Process.run("/bin/sh", input: socket, output: socket, error: socket)
  puts "process ending"
end

server = TCPServer.new(PORT)

loop do
  if socket = server.accept?
    spawn handle_connection(socket)
  else
    break
  end
end

当我运行 main.cr,nc localhost 2022 并发送“exit”时,我希望套接字正确关闭,但他没有,当我发送更多命令时,程序会引发错误

Unhandled exception in spawn: Error writing file: Broken pipe (Errno)
  from /usr/lib/crystal/crystal/system/unix/file_descriptor.cr:79:13 in 'unbuffered_write'
  from /usr/lib/crystal/io/buffered.cr:122:14 in 'write'
  from /usr/lib/crystal/io.cr:1130:7 in 'copy'
  from /usr/lib/crystal/process.cr:413:7 in 'copy_io'
  from /usr/lib/crystal/process.cr:409:11 in 'copy_io:close_dst'
  from /usr/lib/crystal/process.cr:298:17 in '->'
  from /usr/lib/crystal/fiber.cr:255:3 in 'run'
  from /usr/lib/crystal/fiber.cr:47:34 in '->'
  from ???

最佳答案

这是 Crystal 的一个已知问题。这里有一个 Unresolved 问题:

https://github.com/crystal-lang/crystal/issues/7810

关于tcp - 进程和 TCPSocket 在 Crystal 中没有正确关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56645972/

相关文章:

sockets - 如何在 Go 中为 TCP 数据包设置 "don' t 片段”标志位?

linux - 了解进程池: how does a process pool use wait() to reap child process?

java - fork 两个交互式 bash 进程会导致父进程停止或第二个 bash 进入后台

crystal-lang - 克隆对象 Crystal 数组

crystal-lang - Nil check in `||` , `!a || a.method` 不能用多个变量完成

.net - TcpClient - 如何确定何时传送字节?

Python 访问 BaseRequestHandler

python - 同时处理 TCP 和 UDP 的 Twisted 协议(protocol)

c - 什么时候进行进程切换

crystal-lang - 是否可以手动获取 `yield` 值而不是在循环中?