【发布时间】:2012-02-05 19:32:26
【问题描述】:
我编写了简单的 http 客户端,遇到了以下问题,我从官方文档中复制粘贴了 do_recv,但它的工作方式很奇怪:
do_recv(Sock, Bs) ->
case gen_tcp:recv(Sock, 0, ?TIMEOUT) of
{ok, B} ->
gen_tcp:shutdown(Sock, write), % <-- this appears to fix the problem!
do_recv(Sock, [Bs, B]);
{error, closed} ->
{ok, list_to_binary(Bs)}
end.
聊天顺序如下:
{ok, S} = gen_tcp:connect(Ip, Port, [inet, binary,
{packet, 0},
{active, false},
{nodelay, true},
{reuseaddr, true}], 2000),
Req = io_lib:format("GET ~s HTTP/1.1\r\nHost: ~s\r\n\r\n", [Url, UrlHost]),
ok = gen_tcp:send(S, list_to_binary(Req)) of
do_recv(S, []);
对do_recv 的最终调用有时会按预期工作并返回服务器
respose,但有时它挂起和超时,我猜是因为服务器没有关闭套接字
在其自己的。
所以第二种超时情况是我想避免的,任何想法
如何应对这种行为?
UPD:
我添加了gen_tcp:shutdown 对do_recv 函数的调用(参见代码示例中的注释),
这似乎解决了这个问题。我知道这个问题很愚蠢,解决方案
很像猜测,也许有人仍然可以解释这里发生的事情
他们通常如何解决这类问题。
【问题讨论】:
标签: erlang