Sockets Erlang TCP服务器-混合套接字模型

Sockets Erlang TCP服务器-混合套接字模型,sockets,tcp,erlang,Sockets,Tcp,Erlang,我正在尝试在Erlang中实现混合(主动/被动)套接字模型TCP服务器: %%%------------------------------------------------------------------- %%% @author mylesmcdonnell %%% @copyright (C) 2015, <COMPANY> %%% @doc %%% %%% @end %%% Created : 04. Feb 2015 14:01 %%%----------------

我正在尝试在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.
%%%-------------------------------------------------------------------
%%%@author mylescdonnell
%%%@版权所有(C)2015,
%%%@doc
%%%
%%%@end
%%%创建日期:04。2015年2月14:01
%%%-------------------------------------------------------------------
-模块(mmkvstore_srv)。
-作者(“Myleschdonnell”)。
%%原料药
-导出([start/1])。
开始(端口)->
{ok,Listen}=gen_tcp:Listen(端口,[binary,{packet,4},{reuseaddr,true},{active,once}]),
繁殖(fun()->连接(侦听)结束)。
连接(听)->
io:格式(“正在等待连接~n”),
{ok,Socket}=gen_tcp:accept(Listen),
io:格式(“已接受连接~n”),
繁殖(fun()->connect(Listen)end),
回路(插座)。
循环(套接字)->
接收
{tcp,套接字,Bin}->
io:格式(“服务器消息rcvd~n”),
gen_tcp:发送(套接字、Bin),
inet:setops(套接字,[{active,once}]),
回路(插座);
{tcp_已关闭,套接字}->
io:格式(“套接字关闭~n”);
_ ->
io:格式(“不匹配的消息rcvd~n”)
结束。
但是,将套接字重置为活动(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}]}]}
=错误报告===2015年2月4日::16:25:24===
使用退出值处理时出错:{unde,[{inet,setops,[#Port,[{active,once}]],[]},{mmkvstore_srv,loop,1,[{file,“mmkvstore_srv.erl”},{line,34}]}

我正在关注Erlang2.0CHP17的编程。问题是否与在同一套接字上发送的前一行有关?

是,而不是
inet:setops/2
undef
表示没有这样的函数,或者它没有导出。

Doh!非常感谢。我来自C#,所以我习惯了编译器识别打字错误。