Erlang TCP Socket

Erlang TCP Socket            

 
 转载请注明,来自 http://blog.csdn.net/skyman_2001

一旦打开了一个使用TCP连接的套接字,它就始终保持打开状态,直至任何一方关闭它或因为一个错误而终止。在建立一个连接时,一般为每一次请求产生一个新进程,只要有请求被处理,就保持这个进程的存活。

假设有一个监听进程,其任务是等待传入的TCP请求。只要一个请求到达,响应该连接请求的进程就变成了接收进程,有2种方案:

1. 产生新的进程并成为接收进程,而监听者返回并继续监听下一个新的连接请求:

  1. server() ->  
  2.     {ok, ListenSocket} = gen_tcp:listen(1234, [binary, {active, false}]),  
  3.     wait_connect(ListenSocket,0).  
  4.  wait_connect(ListenSocket, Count) ->  
  5.     {ok, Socket} = gen_tcp:accept(ListenSocket),  
  6.     Pid = spawn(?MODULE, get_request, [Socket, [], Count]),  
  7.     %将该套接字的控制进程改为Pid进程  
  8.     gen_tcp:controlling_process(Socket, Pid),  
  9.     wait_connect(ListenSocket, Count+1).  
  10.       
  11.   
  12. get_request(Socket, BinaryList, Count) ->  
  13.     case gen_tcp:recv(Socket, 0, 5000) of  
  14.     {ok, Binary} ->  
  15.         io:format("received data: ~p~n", [binary_to_list(Binary)]),  
  16.         get_request(Socket, [Binary|BinaryList], Count);  
  17.     {error, closed} ->  
  18.         handle(lists:reverse(BinaryList), Count)  
  19.     end.  
server() ->
    {ok, ListenSocket} = gen_tcp:listen(1234, [binary, {active, false}]),
    wait_connect(ListenSocket,0).
 wait_connect(ListenSocket, Count) ->
    {ok, Socket} = gen_tcp:accept(ListenSocket),
    Pid = spawn(?MODULE, get_request, [Socket, [], Count]),
    %将该套接字的控制进程改为Pid进程
    gen_tcp:controlling_process(Socket, Pid),
    wait_connect(ListenSocket, Count+1).
    

get_request(Socket, BinaryList, Count) ->
    case gen_tcp:recv(Socket, 0, 5000) of
	{ok, Binary} ->
		io:format("received data: ~p~n", [binary_to_list(Binary)]),
	    get_request(Socket, [Binary|BinaryList], Count);
	{error, closed} ->
	    handle(lists:reverse(BinaryList), Count)
    end.


2. 使监听进程成为接收进程,并使产生的新进程成为新的监听者:

  1. server() ->  
  2.     {ok, ListenSocket} = gen_tcp:listen(1234, [binary, {active, false}]),  
  3.     wait_connect(ListenSocket,0).  
  4.   
  5.   
  6. wait_connect(ListenSocket, Count) ->  
  7.     {ok, Socket} = gen_tcp:accept(ListenSocket),  
  8.     spawn(?MODULE, wait_connect, [ListenSocket, Count+1]),  
  9.     get_request(Socket, [], Count).  
server() ->
    {ok, ListenSocket} = gen_tcp:listen(1234, [binary, {active, false}]),
    wait_connect(ListenSocket,0).


wait_connect(ListenSocket, Count) ->
    {ok, Socket} = gen_tcp:accept(ListenSocket),
    spawn(?MODULE, wait_connect, [ListenSocket, Count+1]),
    get_request(Socket, [], Count).


说明:

(1)  创建一个套接字的进程(通过调用gen_tcp:accept或gen_tcp:connect)也就是该套接字的控制进程,该套接字所收到的任何消息都会转发给这个控制进程,如果控制进程消亡,那么该套接字也会自行关闭。我们可以通过gen_tcp:controlling_process(Socket, NewPid)函数来把一个套接字的控制进程改为新的控制进程NewPid;

(2) gen_tcp:accept和gen_tcp:recv是阻塞的,可以用prim_inet:async_accept和prim_inet:async_recv实现非阻塞。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值