书上的意思是这样,如果在同一个erlang进程中,同时等待多个socket上的数据,那么用passive mode就只能等到一个socket上的数据到了,才能接收其他socket上发来的数据。
和你描述的情景“每accept一次,spawn一个进程出来gen_tcp:recv“不一样。
事实上,用一个进程来处理一个socket,passive mode和active once没多大差别,因为passive mode的实现是
向inet driver发recv命令出去,然后阻塞在那里等待接收一条{inet_async, S, Ref, Status}消息。
在inet_driver中,收到消息时,如果socket是处在passive mode的,就会向caller发回一条消息inet_async消息,否则就调tcp_message发回一条active mode message {tcp, S, [H1,...Hsz | Data]}。
tcp_reply_data()
/* No body parsing, return raw binary */
if (desc->inet.active == INET_PASSIVE)
return inet_async_data(INETP(desc), body, bodylen);
else
code = tcp_message(INETP(desc), body, bodylen);
}
if (code < 0)
return code;
if (desc->inet.active == INET_ONCE)
desc->inet.active = INET_PASSIVE;
如果是active once模式,发完一条消息就变成passive mode了。
--
Best,
Wei Cao