4

パケットのバイト数を50に制限するために、このサーバーを使用するように変更しました。であるはずなのでgen_tcp:recv、行をコメントアウトしました。これはクライアント側のerlシェルですinet:setopts(Socket, [{active, once}]),gen_tcp:recv{active,false}

2> cp3:client().
exit
3> 

これはサーバー側のerlシェルです

4> cp3:server().
Started Server:
<0.46.0>
Accept Server:
Pid <0.48.0>
Connection accepted 
Accept Server:
Loop Server:
5> 

また、ソケットが作成されない{tcp_closed, Socket}場合、戻り値でソケットが閉じられたかどうかをどのように知ることができるのでしょうか。gen_tcp:recv

-module(cp3).
-export([client/0, server/0,start/0,accept/1,enter_loop/1,loop/1]).

client() ->
    {ok, Socket} =  gen_tcp:connect("localhost", 4001,[list, {packet, 0}]),
    ok = gen_tcp:send(Socket, "packet"),
    receive
        {tcp,Socket,String} ->
            io:format("Client received = ~p~n",[String]),       
            io:format("Client result = ~p~n",[String]),
            gen_tcp:close(Socket)
        after 1000 ->
            exit        
    end.

server() -> 
    Pid = spawn(fun()-> start() end),
    Pid.

start() ->  
    io:format("Started Server:~n"),
    {ok, Socket} = gen_tcp:listen(4001, [binary, {packet, 0},{reuseaddr, true},{active, false}]),
    accept(Socket).

accept(ListenSocket) ->
    io:format("Accept Server:~n"),
    case gen_tcp:accept(ListenSocket) of
        {ok, Socket} ->
            Pid = spawn(fun() ->
                io:format("Connection accepted ~n", []),
                enter_loop(Socket)
            end),
            io:format("Pid ~p~n",[Pid]),
            gen_tcp:controlling_process(Socket, Pid),
            Pid ! ack,
            accept(ListenSocket);
        Error ->
            exit(Error)
    end.

enter_loop(Socket) ->
    %% make sure to acknowledge owner rights transmission finished
    receive ack -> ok end,
    loop(Socket).

loop(Socket) ->
    %% set socket options to receive messages directly into itself
    %%inet:setopts(Socket, [{active, once}]),
    io:format("Loop Server:~n"),
    case gen_tcp:recv(Socket, 50) of
    {ok, Data} ->  
        case Data of
            <<"packet">> ->                 
                io:format("Server replying = ~p~n",[Data]),   
                gen_tcp:send(Socket, Data),
                loop(Socket)                  
        end;
    {error, Reason} ->      
        io:format("Error on socket ~p reason: ~p~n", [Socket, Reason])          
    end.
4

1 に答える 1

4

私はあなたの質問についてあまり明確ではありませんが、上記のコードは機能しません。以下があなたの問題に答えることを願っています。tcp受信case gen_tcp:recv(Socket, 50) ofに1つのエラーがあります。50バイトの読み取りを待機しています。gen_tcp:recv/2のドキュメントを確認してください。すべてのバイトを受信するには、長さ(packer 6の長さですができれば)0に変更します。

この値はデータのサイズを制限しませんが、長さ50のデータを受信するまでデータを送り返しません。代わりに、受け入れてからチェックする必要がある場合があります。

于 2013-03-25T14:59:37.510 に答える