Sockets tcp服务器和客户端交互
我有一个tcp服务器(echo服务器)接受连接。我有一个客户端,当给它一个参数N时,它会创建许多试图连接tcp侦听器的进程。我可以连接到这些套接字,但我可以看到许多套接字被关闭,这很明显,因为我使用的是echo服务器,我没有收到我发送的消息 以下是服务器代码(关键部分) 连接到服务器的客户端。创建N个进程,这些进程连接到服务器,然后使用返回的套接字进行通信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
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.