sockets - 你能从一个正在运行的 TCP 服务器中启动一个新的 TCP 服务器吗?

标签 sockets tcp elixir

我正在用 Elixir 做一个奇怪的实验。 (也许这并不奇怪,但我以前没有做过。)

我正在尝试设置一个可以根据某些输入触发其他 TCP 服务器的 TCP 服务器。这不会在任何地方投入生产 - 只是想看看有什么可能。我对 TCP 不是很熟悉。

第一台服务器启动正常,但当我尝试向第一台服务器(通过 telnet)键入类似“PORT 9000”的内容时,我的代码抛出此错误:

FunctionClauseError) no function clause matching in :inet_tcp.getserv/1
    (kernel) inet_tcp.erl:55: :inet_tcp.getserv("9000")
    (kernel) gen_tcp.erl:190: :gen_tcp.listen/2
    (gen_tcp) lib/tcp_server.ex:11: TcpServer.init/1
    (stdlib) gen_server.erl:328: :gen_server.init_it/6
    (stdlib) proc_lib.erl:247: :proc_lib.init_p_do_apply/3

代码如下:

defmodule TcpServer do
  use GenServer

  def start_link(port) do
    ip = Application.get_env :tcp_server, :ip, {127,0,0,1}
    port = Application.get_env :tcp_server, :port, port
    GenServer.start_link(__MODULE__,[ip,port],[])
  end

  def init [ip,port] do
    {:ok, listen_socket} = :gen_tcp.listen(port,[:binary, {:packet, 0}, {:active, true}, {:ip, ip}])
    {:ok, socket} = :gen_tcp.accept listen_socket
    {:ok, %{ip: ip, port: port, socket: socket}}
  end

  def handle_info({ :tcp, socket, packet }, state) do
    # Expects something like "PORT 3456"
    if packet =~ "PORT" do
      port_number = String.slice(packet, -5..-2)
      TcpServer.start_link(port_number)
      :gen_tcp.send socket, "Started new server on port #{port_number}"
    else
      :gen_tcp.send socket, "Message received... \n"
    end
    IO.inspect packet, label: "incoming packet"
    {:noreply, state}
  end

  def handle_info({:tcp_closed, socket}, state) do
    IO.inspect "Socket has been closed"
    {:noreply, state}
  end

  def handle_info({:tcp_error, socket, reason}, state) do
    IO.inspect socket,label: "connection closed dut to #{reason}"
    {:noreply, state}
  end
end

我是在做错什么,还是因为某些我不知道的原因而无法正常工作?

(代码主要来自 https://medium.com/blackode/quick-easy-tcp-genserver-with-elixir-and-erlang-10189b25e221 )

最佳答案

在 Erlang 文档中找到:

getserv(Port) when is_integer(Port) -> {ok, Port};

看起来我需要这个:

{port_number, _extra} = Integer.parse(String.slice(packet, -5..-2))

关于sockets - 你能从一个正在运行的 TCP 服务器中启动一个新的 TCP 服务器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45045698/

相关文章:

linux - 如何最有效地处理大量文件描述符?

elixir - 为什么 `unquote`可以在宏外部调用?

sockets - TCP keepalive 是否会刷新 NAT 上的超时?

python - 几次请求后 wsgiref.simple_server 出现奇怪的滞后/延迟/延迟/任何问题

c# - WCF 中托管的 TCP Keep Alive 连接

php - 无法绑定(bind)到 tcp ://127. 0.0.1:8080:地址已在使用中

fonts - 在 Phoenix 中使用自定义字体

elixir - 为什么 elixir 改变了向进程发送消息的符号?

python - 当客户端没有在Python中写任何内容(我只按Enter)时,如何从服务器验证变量

java - 如何在java聊天中更新JList