Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 在erlang中编写并行TCP服务器_Sockets_Tcp_Erlang - Fatal编程技术网

Sockets 在erlang中编写并行TCP服务器

Sockets 在erlang中编写并行TCP服务器,sockets,tcp,erlang,Sockets,Tcp,Erlang,“为并发世界编程Erlang软件”说,要编写并行TCP服务器,请执行以下操作: start_parallel_server() -> {ok, Listen} = gen_tcp:listen(...), spawn(fun() -> par_connect(Listen) end). par_connect(Listen) -> {ok, Socket} = gen_tcp:accept(Listen), spawn(fun() ->

“为并发世界编程Erlang软件”说,要编写并行TCP服务器,请执行以下操作:

start_parallel_server() ->
    {ok, Listen} = gen_tcp:listen(...),
    spawn(fun() -> par_connect(Listen) end).

par_connect(Listen) ->
    {ok, Socket} = gen_tcp:accept(Listen),
    spawn(fun() -> par_connect(Listen) end),
    loop(Socket).

loop(...) -> %% handle request here

启动\u并行\u服务器
完成其工作时,它将关闭侦听套接字。我们是否应该在其末尾添加类似于
timer:sleep(infinity)
的内容?

如果从shell运行
start\u parallel\u server()
,shell进程将拥有侦听套接字,因此只要该shell进程处于活动状态,它就会保持活动状态。请注意,shell进程在异常情况下死亡,新的shell进程重新启动……可能会导致混乱


但是,如果您生成一个新进程,然后调用
start\u parallel\u server()
函数,您将需要在生成的进程中进行睡眠以保持其活动状态。

此外,对于真实世界的应用程序更合适。

@Hynek Pichi Vychodil gen\u tcp将链接到调用
gen\u tcp:listen的进程。当此进程在
spawn(fun()->par_connect(Listen)end)之后停止时。
则Listen套接字也将关闭。我认为我们应该在
start\u parallel\u server()
的末尾添加
timer:sleep(infinity)
,这样它就不会结束。是的,这个进程调用
gen\u tcp:listen
,它拥有这个套接字,如果它死了,这个监听套接字以及所有用它打开的套接字都将关闭。您可以从一个特殊进程中调用它,也可以使用
gen\u tcp:controlling\u process/2
将它移交给另一个进程。