Erlang TCP Socket的接收进程的2种方案
转自:http://blog.csdn.net/summerhust/article/details/8740973
一旦打开了一个使用TCP连接的套接字,它就始终保持打开状态,直至任何一方关闭它或因为一个错误而终止。在建立一个连接时,一般为每一次请求产生一个新进程,只要有请求被处理,就保持这个进程的存活。
假设有一个监听进程,其任务是等待传入的TCP请求。只要一个请求到达,响应该连接请求的进程就变成了接收进程,有2种方案:
1. 产生新的进程并成为接收进程,而监听者返回并继续监听下一个新的连接请求:
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. 使监听进程成为接收进程,并使产生的新进程成为新的监听者:
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实现非阻塞。
Erlang TCP Socket的接收进程的2种方案的更多相关文章
- C# TCP socket发送大数据包时,接收端和发送端数据不一致 服务端接收Receive不完全
简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...
- 如何通过Socket TCP发送并接收一个文件?
一.小结 1.大包发小包收,只发一次. 2.发时把文件扩展名,文件长度也随同一起发送,方便接收端接收时另存为正确的文件类型,并判断是否已经接收完毕. 如果不一起发送,分为文件扩展名,文件长度,文件内容 ...
- Python3的tcp socket接收不定长数据包接收到的数据不全。
Python Socket API参考出处:http://blog.csdn.net/xiangpingli/article/details/47706707 使用socket.recv(pack_l ...
- Python socket进阶 多线程/进程
#首先,什么场合下用进程,什么场合下用线程: . 计算密集型的用进程. . IO密集型的用进程. xSocket语法及相关 Socket Families(地址簇) socket.AF_UNIX un ...
- Python Tcp Socket
socket(套接字),传输层通信的端点,由IP和端口号组成(IP,Port),可以通过socket精确地找到服务器上的进程并与之通信 python2.6实现,基于AF_INET(网络套接字) 类型S ...
- nginx、php-fpm默认配置与性能–TCP socket还是unix domain socket【转】
原文地址:https://www.cnxct.com/default-configuration-and-performance-of-nginx-phpfpm-and-tcp-socket-or-u ...
- <转>Go语言TCP Socket编程
授权转载: Tony Bai 原文连接: https://tonybai.com/2015/11/17/tcp-programming-in-golang/ Golang的主要 设计目标之一就是面向大 ...
- linux一切皆文件之tcp socket描述符(三)
一.知识准备 1.在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件(比如:块设备,socket套接字,pipe队列) 2.操作这些不同的类型就像操作文件一样,比如增删改查等 二.环境准备 ...
- TCP Socket的一些行为
几个重要的结论: 1. read总是在接收缓冲区有数据时立即返回,而不是等到给定的read buffer填满时返回. 只有当receive buffer为空时,blocking模式才会等待,而nonb ...
随机推荐
- 模拟HTTP请求获取返回值
package org.jeecgframework.core.util; import java.io.BufferedReader; import java.io.IOException; imp ...
- linux centos7 常用命令【systemctl替换service】
虽然linux的命令很多都是相同的,但是新版的centos 7 上面与以前的有些命令还是有所不同,不过还好,有提示.所以就在百度上面搜索了以下,作为记载,以后方便查看: centos7 上面启动服务以 ...
- spine 2.1.27 Pro 叠加方式(Blending)
将spine更新到2.1.27 Pro,发现有更多的叠加方式可用了,如图: 以前则只有Normal和Additive可选. 更多的叠加方式对于用spine做特效动画还是比较有用的.不过我还没试这些叠加 ...
- Linux C语言小程序
Linux C语言小程序 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include & ...
- . net 源代码调试
对于 .net framework 中的代码,光拿 Reflector 看是不够过瘾的,如果能够调试进去就好了! 其实,微软是提供了一套 sourcecode 的下载的: http://referen ...
- How to Use HTML5 FUll Screen API(如何使用HTML5全屏接口) 【精】
原文链接:http://www.sitepoint.com/use-html5-full-screen-api/ 如果你不太喜欢变化太快的东西,那么web开发可能不适合你.我曾在2012年末有写过Fu ...
- resource文件
Resources的详情见http://www.csharpwin.com/dotnetspace/10957r3991.shtml 1.create public static void Main( ...
- C++ for fun & test
#include <iostream> using namespace std; class DaYe { public: const DaYe & gege() const { ...
- C语言 · 前10名
算法提高 前10名 时间限制:1.0s 内存限制:256.0MB 问题描述 数据很多,但我们经常只取前几名,比如奥运只取前3名.现在我们有n个数据,请按从大到小的顺序,输出前10个名 ...
- spi 总线协议记录
摘抄至: http://blog.csdn.net/skyflying2012/article/details/11710801 概述: SPI, Serial Perripheral Interfa ...