我正在实现一个接受许多并发连接的服务器。
我使用了这个结构:
loop(Sock) ->
case gen_tcp:accept(Sock) of
{ok, CSock} ->
fork_handling_process(CSock);
{error, Reason} ->
do_something_else();
end,
loop(Sock).
我想知道是否有人发给我一个SYN,但是从来没有给我发送SYN ACK以响应我的服务器ACK,我的服务器是否会被该客户端永远阻止,因为我调用了gen_tcp:accept而没有超时?
顺便说一下,我认为这种情况很难效仿,所以如果你有办法尝试,请告诉我。
提前谢谢。答案 0 :(得分:4)
当你按照你的描述倾听/接受它时有点不同:
有些客户端想要连接:它发送一个SYN,然后你的操作系统发送一个SYN / ACK(erlang没有涉及),当你收到ACK gen_tcp:accept将返回。
当有人向你发送SYN而没有其他内容(如果大量进行会发生SYN泛洪攻击),那么操作系统资源将被保留,但是你的erlang代码没有任何反应,因为三方握手还没有完成。
许多操作系统都在特别关注SYN泛洪攻击,避免过多的资源消耗。
答案 1 :(得分:0)
您使用的方法似乎没问题。您的服务器不会阻止。如果出现问题,我相信您的分叉进程将收到错误,而不是服务器。