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().
매우 분명, 감사합니다 :) –