gen_sctp:send/3就像gen_sctp:send/4,但是你可以设置更多的标志和选项。你已经在客户端代码中使用gen_sctp:send/4(当你与客户端和服务器套接字搞砸左右):
{ok, Assoc} = gen_sctp:connect(ClientSocket, {127,0,0,1}, 1234,[{active,true}]).
gen_sctp:send(ClientSocket, Assoc, 2, <<"hellooooo">>).
而且副教授是sctp_assoc_change记录类型,而gen_sctp:发送只是assoc_id if you provide sctp_assoc_change/4的外观。因此,目前提供#sctp_assoc_change {}或只是关联id行为完全相同。
而且如何能够找出客户端的关联ID服务器?它在消息中提供并获得服务器:
{sctp,#Port<0.6126>,
{127,0,0,1},
1243,
{[{sctp_sndrcvinfo,2,1,[],0,0,0,1409953138,0,18}],
<<"hellooooo">>}}
#sctp_sdnrcvinfo{}记录有告诉关联标识和数据从接收到的流号码字段。您可以从assoc_id领域获得当前关联ID,并将其传递给另一个gen_sctp:发送/ 4:
的
gen_sctp:send(ServerSocket, AssocID, 2, <<"welcome!">>).
流2号可能不会让它因为默认情况下gen_sctp失败:开放让10传入和输出流,但你可以安全地提供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().
非常清晰,非常感谢:) –