2016-12-07 14 views
0

我使用gen_sctp创建服务器 - 客户端模式soscket和同事制作时的例子。如何使用gen_sctp:发送/ 3

在服务器侧:

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

ok = gen_sctp:listen(S,true). 

在客户端:

{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:

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回复客户端的消息呢?

谢谢,最好的问候,

Tran。

回答

0

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(). 
+0

非常清晰,非常感谢:) –

相关问题