[英]associate socket with process
我有问题
我想将进程与一个用户相关联(来自用户的所有请求都接收一个进程,在HTTP 1.1中,默认情况下启用保持活动状态,并且所有请求都通过一个套接字发送。)
我有以下代码:
loop(Sock, Reg_pid) ->
{ok, Conn} = gen_tcp:accept(Sock),
Pid = spawn(fun () -> client_socket(Conn,Reg_pid) end),
gen_tcp:controlling_process(Conn, Pid),
Pid ! {take, Conn}, %% race condition
loop(Sock, Reg_pid).
client_socket(S,Reg_pid) ->
io:format("in~n"),
receive
{take, So} ->
inet:setopts(So, [{active, once}]),
client_socket(So, Reg_pid);
{http, Socket, {http_request, _Method, {abs_path, _Path}, _Vers}} ->
case http_uri2:parse_path_query(_Path) of
{"/",[]} ->
io:format("Main pid - ~p ~n", [self()]),
gen_tcp:send(Socket, response("<a href='http://127.0.0.1:8080/register?name=Max'>Click</a>"));
{"/register",[{"name", Player_name}]} ->
io:format("Register pid - ~p ~n", [self()]);
_-> ok
end,
inet:setopts(Socket, [{active, once}]),
client_socket(Socket, Reg_pid);
{tcp_closed, Socket} ->
io:format("Socket ~w closed [~w]~n",[Socket,self()]);
% gen_tcp:close(Socket);
{tcp_error, Socket, Reason} ->
io:format("Error ~w closed [~w]~n",[Socket,self()]);
_-> ok
end.
当我通过浏览器连接到服务器(索引页),然后单击返回服务器的链接时,我得到下一个结果:
3> server:start(8080).
<0.43.0>
in
Main pid - <0.45.0>
in
in
Register pid - <0.46.0>
in
我不明白为什么我的下一个请求(单击链接)收到其他进程(寄存器pid-<0.46.0>)?
这样,一个用户的所有请求都产生一个新的进程,我希望一个用户的所有请求都可以处理一个进程,我该如何实现呢?
谢谢!
浏览器可能选择不遵守Keep-Alive,而是创建一个新的套接字。 您可以考虑将会话cookie发送到浏览器,而不是信任Keep-Alive,将当前会话与某个进程相关联。 会话cookie将由浏览器针对每个请求发送。 在为新请求创建新流程之前,请检查会话cookie,并查看是否已有与该会话关联的流程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.