Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets tcp服务器和客户端交互_Sockets_Tcp_Erlang_Otp_Gen Tcp - Fatal编程技术网

Sockets tcp服务器和客户端交互

Sockets tcp服务器和客户端交互,sockets,tcp,erlang,otp,gen-tcp,Sockets,Tcp,Erlang,Otp,Gen Tcp,我有一个tcp服务器(echo服务器)接受连接。我有一个客户端,当给它一个参数N时,它会创建许多试图连接tcp侦听器的进程。我可以连接到这些套接字,但我可以看到许多套接字被关闭,这很明显,因为我使用的是echo服务器,我没有收到我发送的消息 以下是服务器代码(关键部分) 连接到服务器的客户端。创建N个进程,这些进程连接到服务器,然后使用返回的套接字进行通信 send(State = #state{}) -> Low = State#state.low, Hig

我有一个tcp服务器(echo服务器)接受连接。我有一个客户端,当给它一个参数N时,它会创建许多试图连接tcp侦听器的进程。我可以连接到这些套接字,但我可以看到许多套接字被关闭,这很明显,因为我使用的是echo服务器,我没有收到我发送的消息

以下是服务器代码(关键部分)

连接到服务器的客户端。创建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.

错误在您的服务器上,您正在tcp闭合服务器上匹配类似于以下消息的模式:

{error, closed} 
但如果您在文档中查找,您会注意到您应该匹配以下消息:

{tcp_closed, Socket}
{tcp_error, Socket, Reason}
使用以下内容更新您的代码:

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.
你应该开始在屏幕上显示关闭的字符串

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.