简体   繁体   English

tcp 服务器和客户端交互

[英]tcp server and client interaction

I have a tcp server(echo server) accepting connections.我有一个接受连接的 tcp 服务器(回声服务器)。 I have a client which when given a parameter N, creates those many processes trying to connect with the tcp listener.我有一个客户端,当给定参数 N 时,它会创建许多尝试与 tcp 侦听器连接的进程。 I am able to connect to those sockets but I can see many sockets being closed which is evident since I am using an echo server, I am not receiving messages back that I sent.我能够连接到这些套接字,但我可以看到许多套接字被关闭,这很明显,因为我使用的是回显服务器,我没有收到我发送的消息。

Here is the server code( crucial part)这是服务器代码(关键部分)

 init(State = #state{port = Port}) ->
 ets:new(csockets, [ordered_set, named_table, public]),
 ets:insert(csockets, {sockets, []}),
 case gen_tcp:listen(Port, ?TCP_OPTIONS) of
   {ok, LSocket} ->
   NewState = State#state{lsocket = LSocket},
   spawn(fun() -> accept(NewState) end),
   {ok, NewState};
   {error, Reason} ->
    {stop, Reason}
  end.


  accept(State = #state{lsocket = LSocket}) ->
  case gen_tcp:accept(LSocket) of
   {ok, Socket} ->
   {sockets, List} = hd(ets:lookup(csockets, sockets)),
   NewList = [Socket | List],
   ets:insert(csockets, {sockets, NewList}),
   Pid = spawn(fun() ->
    loop(Socket)
              end),
    gen_tcp:controlling_process(Socket, Pid),
    accept(State);
    {error, closed} -> State
    end.


   loop(Socket) ->
   case gen_tcp:recv(Socket, 0) of
   {ok, Data} ->
   gen_tcp:send(Socket, Data),
   loop(Socket);
    {error, closed} ->
    io:format("CLOSED ~n"),  %% This asserts for many sockets
    ok
    end.

Client that connects to the server.连接到服务器的客户端。 Creating N processes that connect to the server and then use the returned socket to communicate.创建 N 个连接到服务器的进程,然后使用返回的套接字进行通信。

     send(State = #state{}) ->
     Low = State#state.low,
     High = State#state.high + 1,
     case Low of
      High -> State;
      _Else ->
      N = Low rem 10,
      Dest = lists:nth(1, State#state.dest),
      spawn(?MODULE, loop, [Dest, Low]),
      NewState = State#state{low = Low + 1},
       send(NewState)
      end.

      loop({IP, Port}, Low) ->
      case gen_tcp:connect(IP, Port, [binary, {active, true}]) of
      {ok, Socket} ->
       io:format("~p Connected ~n", [Low]),
       gen_tcp:send(Socket, "Hi"),
      receive
       {tcp, RecPort, Data} ->
       io:format("I have received ~p on port ~p ~n", [Data, RecPort])
      end;
      _Else ->
      io:format("The connection failed ~n")
      loop({IP, Port}, Low)
      end.

The error is on your server, you are pattern matching a messa like this on a tcp closed:错误出在您的服务器上,您在关闭的 tcp 上正在模式匹配这样的消息:

{error, closed} 

but if you go to the documentantion for gen_tcp , you will notice that you should pattern match these messages:但是如果你去gen_tcp的文档,你会注意到你应该模式匹配这些消息:

{tcp_closed, Socket}
{tcp_error, Socket, Reason}

Update your code with:使用以下内容更新您的代码:

loop(Socket) ->
    case gen_tcp:recv(Socket, 0) of
        {ok, Data} ->
            gen_tcp:send(Socket, Data),
            loop(Socket);
        {tcp_error, Socket} ->
            io:format("CLOSED ~n"),  %% This asserts for many sockets
            ok
    end.

and you should start getting the CLOSED string on your screen你应该开始在屏幕上显示 CLOSED 字符串

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM