2016-12-07 3 views
0

사용 예를 사용 중입니다. gen_sctp 서버 - 클라이언트 모델에서 soscket 및 associates를 만듭니다.gen_sctp 사용 방법 : send/3

{ok,Client} = gen_sctp:open(1243,[{ip,{127,0,0,1}},{reuseaddr,true}]). 

{ok,Ass} = gen_sctp:connect(S,{127,0,0,1},1234,[{active,true}]). 

그리고 클라이언트가 전송하여 서버에 메시지를 보낼/4 :

{ok,serverSocket} = gen_sctp:open(1234,[{ip,{127,0,0,1}},{reuseaddr,true},{active,true}]). 

ok = gen_sctp:listen(S,true). 

클라이언트 측에서 : 서버 측에서

gen_sctp:send(S,Ass,2,<<"hellooooo">>). 

그리고 메시지가 서버에 수신 측면 :

{sctp,#Port<0.6126>, 
       {127,0,0,1}, 
       1243, 
       {[{sctp_sndrcvinfo,2,1,[],0,0,0,1409953138,0,18}], 
       <<"hellooooo">>}} 

그렇다면 서버가 send/3를 통해 클라이언트에 메시지를 어떻게 회신 할 수 있습니까?

감사의 인사,

트란.

답변

0

gen_sctp : send/3은 gen_sctp : send/4와 비슷하지만 더 많은 플래그와 옵션을 설정할 수 있습니다. (당신이 클라이언트와 서버 소켓 주위를 엉망 동안) 이미 클라이언트 코드에 gen_sctp:send/4을 사용하고 있습니다 :/4 단지 assoc_id if you provide sctp_assoc_change을 찾습니다 보내 gen_sctp 동안

{ok, Assoc} = gen_sctp:connect(ClientSocket, {127,0,0,1}, 1234,[{active,true}]). 
gen_sctp:send(ClientSocket, Assoc, 2, <<"hellooooo">>). 

그리고 연합회sctp_assoc_change 레코드 유형이다. 그래서 현재 #sctp_assoc_change {} 또는 그냥 association id를 제공하는 것은 똑같이 행동합니다.

그리고 서버에서 클라이언트의 연관 ID를 어떻게 찾을 수 있습니까? 서버가받은 메시지에 제공된 것 :

{sctp,#Port<0.6126>, 
       {127,0,0,1}, 
       1243, 
       {[{sctp_sndrcvinfo,2,1,[],0,0,0,1409953138,0,18}], 
       <<"hellooooo">>}} 

#sctp_sdnrcvinfo{} 기록 협회 ID와 데이터로부터 수신 스트림 번호를 말하고 필드가 있습니다. 당신은 assoc_id 필드에서 현재 연결 ID를 얻고 다른 gen_sctp에 전달할 수 있습니다/4 전송 : 아마 때문에 기본 gen_sctp으로 실패하지 않습니다

gen_sctp:send(ServerSocket, AssocID, 2, <<"welcome!">>).

스트림 번호 2의 : 오픈 10오고 있습니다 나가는 스트림은 0이지만 스트림 번호로 0을 안전하게 제공 할 수 있습니다. 여기

전송 및 SCTP 데이터를 수신하는 예이다 : 당신의 노력에 대한 너무 많은

#!/usr/bin/escript 

-include_lib("kernel/include/inet_sctp.hrl"). 

server_loop(Socket) -> 
    receive 
    {sctp, Socket, _FromIP, _FromPort, {[#sctp_sndrcvinfo{assoc_id=AssocID}], 
             Payload}} -> 
     gen_sctp:send(Socket, #sctp_sndrcvinfo{assoc_id=AssocID, stream=0}, 
        <<"pong">>), 
     % or less complex gen_sctp:send/4 
     gen_sctp:send(Socket, AssocID, 0, <<"pong">>); 
    Rest -> 
     io:format("server got unhandled message ~w~n", [Rest]) 
    end, 
    server_loop(Socket). 

create_server_socket() -> 
    {ok, Socket} = gen_sctp:open(1234, [{ip,{127,0,0,1}}, {reuseaddr,true}, 
             {active,true}]), 
    gen_sctp:listen(Socket, true), 
    {ok, Socket}. 

run_server() -> 
    Spawner = self(), 
    spawn_link(fun() -> 
    {ok, Socket} = create_server_socket(), Spawner ! ready, server_loop(Socket) 
    end), 
    receive 
    ready -> 
     io:format("server is up~n"), 
     ok 
    after 100 -> 
     throw(server_timeout) 
    end. 

ping_server() -> 
    {ok, Socket} = gen_sctp:open(1243, [{ip,{127,0,0,1}}, {reuseaddr, true}]), 
    {ok, AssocChange} = gen_sctp:connect(Socket, {127,0,0,1}, 1234, [{active, true}]), 
    gen_sctp:send(Socket, AssocChange, 2, <<"ping">>), 
    receive 
    {sctp, Socket, _FromIP, _FromPort, {[#sctp_sndrcvinfo{}], Payload}} -> 
     io:format("client got payload ~p~n", [Payload]) 
    after 2000 -> 
     throw(client_timeout) 
    end. 

main([]) -> 
    run_server(), 
    ping_server(). 
+0

매우 분명, 감사합니다 :) –