server.erl:
-module(server). -compile(export_all). start(Num,LPort) -> case gen_tcp:listen(LPort,[{active, false},{packet,2}]) of {ok, ListenSock} -> start_servers(Num,ListenSock), {ok, Port} = inet:port(ListenSock), Port; {error,Reason} -> {error,Reason} end. start_servers(0,_) -> ok; start_servers(Num,LS) -> spawn(?MODULE,server,[LS]), start_servers(Num-1,LS). server(LS) -> case gen_tcp:accept(LS) of {ok,S} -> loop(S), server(LS); Other -> io:format("accept returned ~w - goodbye!~n",[Other]), ok end. loop(S) -> inet:setopts(S,[{active,once}]), receive {tcp,S,Data} -> io:format("recv tcp data~n"), io:format("~p~n~w~n", [Data, Data]), gen_tcp:send(S,<<"world">>), loop(S); {tcp_closed,S} -> io:format("Socket ~w closed [~w]~n",[S,self()]), ok end.
client.erl:
-module(client). -compile(export_all). test_packet_splicing(PortNo) -> {ok,Sock} = gen_tcp:connect("192.168.1.2", PortNo, [binary, {active, false}]), gen_tcp:send(Sock, <<0,5,104,101,108,108,111, 0,5,104,101,108,108,111>>), A = gen_tcp:recv(Sock,0), gen_tcp:close(Sock), A. test_package_spliting(PortNo) -> {ok,Sock} = gen_tcp:connect("192.168.1.2", PortNo, [binary, {active, false}, {delay_send, false}]), gen_tcp:send(Sock, <<0,5,104,101>>), gen_tcp:send(Sock, <<108,108,111>>), A = gen_tcp:recv(Sock,0), gen_tcp:close(Sock), A.
server:start(10, 81000).
client:test_packet_splicing(8100).
client:test_package_spliting(8100).
贴结果:
server输出
抓包:
沾包报文:
断包报文:
So, 直接在处理socket的process中大胆进行处理吧!
转载请标明出处http://ziplee.iteye.com/blogs/2198614