gen_server, gen_tcp question
Francesco Cesarini
francesco@REDACTED
Wed Jul 17 10:22:21 CEST 2002
Hi Eric,
welcome to the world of Erlang.
I assume the problem you have stumbled across is the usage of gen_tcp in
passive modes, making your gen_server hang until receive the request.
(The same applies to receiving data). You will be hanging, and thus
unable to handle code upgrades or other requests sent to the server. You
could use the timeout, but that will generate an unnecessary overhead.
Your solution is to spawn a process (Not following any behaviors), which
hangs in the call gen_tcp:accept/1 waiting for a connection request.
Make sure this process is linked to your gen_server. When you receive a
request, make your gen_server the controlling process and receive your
packages in active mode using the handle_info call.
Should you want to implement code upgrades, make sure you set the
timeout to a very low value. This will kill your listener process. Just
make sure you respawn it after the upgrade.
Hope the above helps. Good documentation on OTP design principles is at
http://www.erlang.org/doc/r8b/doc/design_principles/part_frame.html .
Mickael Remond & I wrote a paper on the "non" usage of OTP outside
Ericsson you might find interesting. You can read about at
http://www.erlang-consulting.com/euc2001/index.htm
Good Luck,
Francesco
--
http://www.erlang-consulting.com
Eric Merritt wrote:
>Guys,
>
> As some of you may know I am fairly new to erlang. I
>have been poking around a bit getting my feet wet,
>messing with yaws, mnesia, etc. Well I am finally
>getting around to coding a fairly heft application as
>a learning exercise and I have hit a stumbling block.
>I am just begining to write the tcp comm part of the
>application, I would love to follow the otp practices
>and make use of gen_server. There even seems to be
>some arcane way for gen_tcp and gen_server to work
>together for a module. I can't, for the life of me,
>figure it out. The documentation is pretty sparse in
>this area as well.
>
>
> If I missed some documentation somewhere could one of
>you point it out or if I missed something obvious just
>let me know my error. Otherwise a little example would
>be great.
>
>I have spent a significant amount of time searching
>the archives, the net, etc. Also I have attempted to
>look at the inets and yaws source to figure this out.
>The only problem there is that both the inets source
>and the yaws source is largly undocumented. So I tend
>to just get a headache accompanied by very little
>understanding.
>
>So if one of you could point me in the right direction
>that would be great. Otherwise I may have just
>revealed the true magnitude of my ingnorance :)
>
>Thanks,
>Eric
>
>__________________________________________________
>Do You Yahoo!?
>Yahoo! Autos - Get free new car price quotes
>http://autos.yahoo.com
>
>
More information about the erlang-questions
mailing list