【问题标题】:Erlang TCP Server - Hybrid Socket ModelErlang TCP 服务器 - 混合套接字模型
【发布时间】:2015-04-04 06:43:18
【问题描述】:

我正在尝试在 Erlang 中实现一个混合(主动/被动)套接字模型 TCP 服务器:

%%%-------------------------------------------------------------------
%%% @author mylesmcdonnell
%%% @copyright (C) 2015, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 04. Feb 2015 14:01
%%%-------------------------------------------------------------------
-module(mmkvstore_srv).
-author("mylesmcdonnell").

%% API
-export([start/1]).

start(Port) ->
  {ok, Listen} = gen_tcp:listen(Port, [binary, {packet, 4}, {reuseaddr, true}, {active, once} ]),
  spawn(fun() -> connect(Listen) end).

connect(Listen) ->
  io:format("Waiting for connection~n"),
  {ok, Socket} = gen_tcp:accept(Listen),
  io:format("Connection accepted~n"),
  spawn(fun() -> connect(Listen) end),
  loop(Socket).

loop(Socket) ->
  receive
    {tcp, Socket, Bin} ->
      io:format("Server msg rcvd~n"),
      gen_tcp:send(Socket, Bin),
      inet:setops(Socket, [{active, once}]),
      loop(Socket);
    {tcp_closed, Socket} ->
      io:format("Socket closed~n");
    _ ->
      io:format("Unmatched message rcvd ~n")
  end.

但是,将套接字重置为活动的调用 (inet:setops(Socket, [{active, once}]),) 失败并显示以下内容:

=ERROR REPORT==== 4-Feb-2015::16:25:24 ===
Error in process <0.156.0> with exit value: {undef,[{inet,setops,[#Port<0.2581>,[{active,once}]],[]},{mmkvstore_srv,loop,1,[{file,"mmkvstore_srv.erl"},{line,34}]}]}

我正在关注 Programming Erlang 2.0 Chp17。是不是和上一行在同一个socket上发送有关?

【问题讨论】:

    标签: sockets tcp erlang


    【解决方案1】:

    这是inet:setopts/2,而不是inet:setops/2undef 表示没有这个功能,或者没有导出。

    【讨论】:

    • 噢!谢谢。我来自 C#,所以我习惯于编译器找出拼写错误。
    猜你喜欢
    • 2014-01-13
    • 1970-01-01
    • 2015-12-07
    • 2012-06-13
    • 2014-07-02
    • 2017-01-27
    • 1970-01-01
    • 2015-09-04
    • 2023-03-07
    相关资源
    最近更新 更多