erlang - Erlang gen_tcp 连接仅适用于同一网络
问题描述
正如问题所述,当我设置服务器时,它可以在同一网络(不同的计算机但相同的 wifi)上接收来自客户端的消息,但是当客户端在另一个网络上时,它无法访问服务器,我不知道为什么它不能。任何人都可以帮忙吗?
-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.
解决方案
感谢您对此的帮助:)
原来是主机上的路由器打开了端口,但是源 IP 地址已设置为主机 IP 地址,我猜这以某种方式将其限制为仅来自网络本身的调用:)
推荐阅读
- python - docker compose 找不到已安装的python
- c - 为什么结构数组不需要大括号初始化?
- php - Symfony 使用外键删除用户
- angular - 动态反应角度表单无法滚动到顶部
- jquery - 在按钮上单击火或模拟选择下拉列表显示
- javascript - 赛普拉斯 waitUntill 在 400 毫秒后重新分层,如何延长其超时时间?
- vb.net - Datatable.Select 列 A 和 B 上具有相同值的行
- flutter - 灵活的小部件不在列内呈现
- c# - 如何在 VSTO c# 中使用代码名称获取工作表名称?
- annotations - 带有注释的 Jdbi3 不能工作,@RegisterBeanMapper 不能工作