erlang写的tcpserver怎么接收c 写的客户端发来的信息
erlang吧
全部回复
仅看楼主
level 4
%% @author google
%% @doc @todo Add description to erlTcpSer.
-module(erlTcpSer).
%% ====================================================================
%% API functions
%% ====================================================================
-export([start/0]).
%%{active, true} 主动模式, 客户端速度过快可能导致服务端内存不足而崩溃
%%{active, false} 被动模式, 在接收数据的地方调用 gen_tcp:recv ,可能等待一个具体的客户端而阻塞在那里
%%{active, once} 半阻塞模式, 主动仅针对一个消息,在控制进程发送完一个数据后,必须显示调用inet:setopts(Socket, [{active, once}])
%%重新激活以便接收下一个消息(在次之前处于阻塞状态),可实现流量控制防止服务器被过多消息淹没。
start () ->
case gen_tcp:listen (2345, [binary, {packet, 4}, {reuseaddr, true}, {active, once}]) of
{ok, ListenSocket} ->
spawn (fun () -> accept_client (ListenSocket) end );
_ -> {listen_error}
end.
accept_client (ListenSocket) ->
case gen_tcp:accept (ListenSocket) of
{ok, ClientSocket} ->
spawn (fun () -> accept_client (ListenSocket) end),
loop (ClientSocket);
_ -> {accept_error}
end.
do_recv(ClientSocket) ->
gen_tcp:recv(ClientSocket, 0),
do_recv(ClientSocket).
loop (ClientSocket) ->
%% get_tcp:recv (ClientSocket, Bin),
%% Reply = gen_tcp:recv(ClientSocket, 37),
%% inet:setopts(ClientSocket, [{active, once}]),
%%
%% io:format("Server (unpacked) ~p~n",[Reply]),
%% gen_tcp:send(ClientSocket,term_to_binary(Reply)),
%% loop(ClientSocket).
receive
{tcp, ClientSocket, Bin} ->
io:format ("Server received binary"),
io:format ("Server received binary = ~p ~n ", [Bin]),
Str = binary_to_term(Bin),
io:format("Server (unpacked) ~p~n",[Str]),
Reply = Str,
timer:sleep(5000),
io:format("Server replying = ~p~n",[Reply]),
gen_tcp:send(ClientSocket,term_to_binary(Reply)),
loop(ClientSocket);
{tcp_closed, ClientSocket} ->
io:format("Client closed~n")
end.
2014年08月01日 03点08分 1
level 4
erlang写的客户端就可以收发
%% @author google
%% @doc @todo Add description to erlClient.
-module(erlClient).
%% ====================================================================
%% API functions
%% ====================================================================
-export([nano_client_eval/1]).
nano_client_eval (Str) ->
{ok, Socket} = gen_tcp:connect ("localhost", 2345, [binary, {packet, 4}]),
ok = gen_tcp:send (Socket, term_to_binary (Str)),
receive
{tcp, Socket, Bin} ->
io:format ("Client received binary = ~p ~n", [Bin]),
Val = binary_to_term (Bin),
io:format ("Client result = ~p~n",[Val]),
gen_tcp:close (Socket)
end.
%% ====================================================================
%% Internal functions
%% ====================================================================
2014年08月01日 03点08分 3
level 4
我在 linux环境下测试的, 然后使用strace跟踪了一下,发现c的信息发过来也收到了, 但是没有去回发给我就把描述符给关闭了。erlang写的客户端却发回来了,所以很纳闷,我是新手 哈哈
2014年08月01日 03点08分 4
level 4
2014年08月01日 03点08分 5
level 4
[吐舌] 没人回答
2014年08月05日 08点08分 6
level 1
我认为是这样的,你c代码的send和recv写在同一个函数,他们的执行是很快的,应当在c代码另外一个地方写个回调函数,从你的c往服务器发送信息到接受要比较长的时间,至少比在一个函数中顺序执行时间长,也就是说这里的c形式上可以,实际上无效,以上为个人观点,我也是初学。这里c代码的sockfd是起到了中介和代理的作用吧,目前我认为是一个中介作用的进程,降低客户端和服务端的耦合性。
2015年01月30日 04点01分 7
加油 !~! 那个问题我后来就没关注了 , 我自己重新写的c代码 就行了。
2015年01月30日 05点01分
level 1
关键在{packet, 4},应该用{packet, 0},即接受或发送未经修改的TCP数据。
2015年02月04日 07点02分 8
level 6
测试回贴
2015年02月05日 03点02分 9
level 1
你直接写的化问题太大,要规定数据包和解码原则,你这样的程序应该会有很多BUG,比如erlang发中文的话就会出问题
2015年10月24日 06点10分 10
1