私はシンプルなHTTPクライアントを作成し、次のような問題に直面し、私はoffficialドキュメントからdo_recv
ことをcopypastedが、それは奇妙な方法で動作します:どのようgen_tcpを使用するには: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.
チャットシーケンスは以下の通りです:
do_recv
へ
{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, []);
、最終呼び出しは時々期待どおりに動作し、サーバ resposeを返しますが、時にはそれは、サーバが独自にソケット を閉じていないので、私は推測する、ハングおよびタイムアウト。 タイムアウトの2番目のケースは、私が避けたい何か、というアイデアです どのようにその動作に対処するには?
UPD:
Iは、(コードサンプル内のコメントを参照してください)do_recv
関数へgen_tcp:shutdown
呼び出しを追加しました 、これは問題を解決するように見えるのです。質問は私が知っているかなりnoobishであり、解決策 はかなり推測のようである、多分誰かがここで何が起こるかを説明することができ、 彼らは通常この種の問題を解決する方法。
固定コードを提供できますか?それとも、複雑すぎるようですか? – Dfr
衝突しましたが、テストされていません。 –