erlang TCP socket 沾包断包处理

1 篇文章 0 订阅
1 篇文章 0 订阅
先贴code, 参照gen_tcp范例编写
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输出
[img]http://dl2.iteye.com/upload/attachment/0107/2354/30edeaa9-8d1c-3bc1-b259-65f44af17bd1.jpg[/img]
抓包:
[img]http://dl2.iteye.com/upload/attachment/0107/2356/fded0028-ab00-3435-8624-ec0ab285f6b3.jpg[/img]
沾包报文:
[img]http://dl2.iteye.com/upload/attachment/0107/2358/18cf16b4-8c69-39ab-a549-62b2bcdacb48.jpg[/img]
断包报文:
[img]http://dl2.iteye.com/upload/attachment/0107/2362/e90d4bbc-9623-31be-b3a5-ea26fc8d70c9.jpg[/img]
[img]http://dl2.iteye.com/upload/attachment/0107/2364/89cea2a9-0778-3e38-b95f-c2fc4db8c111.jpg[/img]

So, 直接在处理socket的process中大胆进行处理吧!

转载请标明出处http://ziplee.iteye.com/blogs/2198614
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值