Erlang gen_tcp подключение работает только в той же сети - PullRequest
1 голос
/ 07 февраля 2020

Поскольку вопрос гласит, что когда я настраиваю свой сервер, он может получать сообщения от клиента, когда он находится в одной сети (на разных компьютерах, но с таким же Wi-Fi), но когда клиент находится в другой сети, он не может добраться до сервера, и у меня есть понятия не имею, почему это не может. Кто-нибудь может помочь?

-module(client).
-export([client/2, clientDNS/4]).
client(PortNo,Message) ->
IP = {1, 1, 1, 1},  % Edited for privicy
{ok,Sock} = gen_tcp:connect(IP,PortNo,[{active,false},{packet,1}]),
Data = term_to_binary(Message),
gen_tcp:send(Sock,Data),
{ok, A} = gen_tcp:recv(Sock,0),
gen_tcp:close(Sock),
Tmp = list_to_binary(A),
Res = binary_to_term(Tmp),
Res.


-module(server_http).
-export([start/1, server/2, loop/2]).

start(LPort) ->
case gen_tcp:listen(LPort,[{active, false},{packet,1}]) of
    {ok, ListenSock} ->
        start_servers(ListenSock),
        {ok, Port} = inet:port(ListenSock),
        Port;
    {error,Reason} ->
        {error,Reason}
end.

start_servers(LS) ->
Pid = setup:setupServer(),
spawn(?MODULE,server,[Pid, LS]),
ok.

server(Pid, LS) ->
case gen_tcp:accept(LS) of
    {ok,S} ->
        loop(Pid, S),
        server(Pid, LS);
    Other ->
        io:format("accept returned ~w - goodbye!~n",[Other]),
        ok
end.

loop(Pid, S) ->
inet:setopts(S,[{active,once}]),
receive
    {tcp,S,Data} ->
        Tmp = list_to_binary(Data),
        case binary_to_term(Tmp) of
            {Mod, Inputs} -> Answer = server:Mod(Pid, Inputs),
                             Res = term_to_binary(Answer),
                             gen_tcp:send(S,Res),
                             loop(Pid, S);
            {Mod}         -> Answer = server:Mod(Pid),
                             Res = term_to_binary(Answer),
                             gen_tcp:send(S,Res),
                             loop(Pid, S)
        end;
    {tcp_closed,S} ->
        io:format("Socket ~w closed [~w]~n",[S,self()]),
        ok;
    _ -> loop(Pid, S)

end.

1 Ответ

1 голос
/ 08 февраля 2020

Спасибо за помощь по этому вопросу:)

Оказалось, что это был маршрутизатор на хосте, у которого были открыты порты, однако IP-адрес источника был установлен на IP-адрес хоста, который я думаю, как-то ограничивает это только звонками из самой сети:)

...