というわけで、書いた Python プログラムを Erlang に変換していて、Erlang を使うのは久しぶりです。だから私は初心者レベルに戻ります。とにかく経験から、ソケットを扱うときに使用するすべての言語には、送受信されるデータの長さを常に返す send/recv 関数があります。ただし、Erlangs gen_tcp の場合はそうではないようです。
send/recv/or inet:setopts を呼び出すと、パケットがいつ終了したかがわかりますか? 受信したいパケット (文字列) でエスケープまたは \n を見つけることができるように、ループする recvAll/sendAll 関数を記述する必要がありますか?
http://erlang.org/doc/man/gen_tcp.html#recv-2
私が使用しているコード例:
server(LS) ->
case gen_tcp:accept(LS) of
{ok,S} ->
loop(S),
server(LS);
Other ->
io:format("accept returned ~w - goodbye!~n",[Other]),
ok
end.
loop(S) ->
inet:setopts(S,[{active,once}]),
receive
{tcp,S,Data} ->
Answer = process(Data), % Not implemented in this example
gen_tcp:send(S,Answer),
loop(S);
{tcp_closed,S} ->
io:format("Socket ~w closed [~w]~n",[S,self()]),
ok
end.
例とドキュメンテーションを見るだけで、Erlang は知っているように見えます。クライアントは私が書いているPHPソケットライブラリであるため、受信されるデータの長さは20バイトから9216バイトまでの範囲であり、チャンクで送信される可能性があるため、確認したいと思います。
ありがとうございました、
アジム。