gpt4 book ai didi

Erlang TCP 套接字关闭

转载 作者:行者123 更新时间:2023-12-02 04:46:23 28 4
gpt4 key购买 nike

为了学习 Erlang,我正在尝试实现一个基于 gen_tcp 的小型 Web 服务器。不幸的是,我的代码似乎触发了一些有线行为。为了演示该问题,我附上了我的实现的最小化版本,它足以重现该问题。无论 HTTP 请求是什么,它都只是传递静态 200 OK。

当我尝试针对我的 Web 服务器(使用环回接口(interface))运行 ab(Apache HTTP 服务器基准测试)时,就会出现问题。没有任何并发​​请求(-c),一切都运行得很好。但是,如果我使用 -c 8-c 16,对 gen_tcp:accept/1 的调用似乎在某些套接字上失败,因为我在 shell 中看到许多 request: returned 行。

让整个故事变得更奇怪的是,我在不同的操作系统上看到了不同的行为:

  • OS X+Erlang/OTP 18:ab 在启动后几乎立即报告“连接被对等方重置”。
  • Debian+Erlang R15B01:除了两个 HTTP 请求之外,所有 HTTP 请求似乎都已通过。但是,当我使用 -n 5000 运行 ab 时,ab 挂起几秒钟并报告“指定的超时已过期,总共 4998 个请求已完成” 。同样,当我运行 15000 次测试时,会报告 14998。

This one似乎不是问题。老实说,我很迷茫,因此感谢任何帮助! :)谢谢!

server(Port) ->
Opt = [list, {active, false}, {reuseaddr, true}],
case gen_tcp:listen(Port, Opt) of
{ok, Listen} ->
handler(Listen),
gen_tcp:close(Listen),
ok;
{error, Error} ->
io:format("init: ~w~n", [Error])
end.

handler(Listen) ->
case gen_tcp:accept(Listen) of
{ok, Client} ->
request(Client),
handler(Listen);
{error, Error} ->
io:format("request: ~w~n", [Error])
end.

request(Client) ->
Recv = gen_tcp:recv(Client, 0),
case Recv of
{ok, _} ->
Response = reply(),
gen_tcp:send(Client, Response);
{error, Error} ->
io:format("request: ~w~n", [Error])
end,
gen_tcp:close(Client).


reply() ->
"HTTP/1.0 200 OK\r\n" ++
"Content-Length: 7\r\n\r\n"
"static\n".

最佳答案

当您增加使用 ab -c N 发送的并发请求数量时,它将立即打开到服务器的多个 TCP 套接字。

默认情况下,使用 gen_tcp:listen/2 打开的套接字将仅支持五个未完成的连接请求。使用 gen_tcp:listen/2 的 {backlog, N} 选项增加未完成的连接请求数。

我在 OS X 上使用 ab 测试了您的代码,发现这解决了“连接由对等方重置”的问题。

关于Erlang TCP 套接字关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32511676/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com