Erlang TCP Socket的接收进程的2种方案

简介: 转自:http://blog.csdn.net/summerhust/article/details/8740973   一旦打开了一个使用TCP连接的套接字,它就始终保持打开状态,直至任何一方关闭它或因为一个错误而终止。

转自: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实现非阻塞。

相关文章
|
6月前
|
存储 Python
Python网络编程基础(Socket编程) UDP 发送和接收数据
【4月更文挑战第10天】对于UDP客户端而言,发送数据是一个相对简单的过程。首先,你需要构建一个要发送的数据报,这通常是一个字节串(bytes)。然后,你可以调用socket对象的`sendto`方法,将数据报发送到指定的服务器地址和端口。
|
6月前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
6月前
|
网络协议 Python
python中socket客户端发送和接收数据
【4月更文挑战第7天】本教程聚焦TCP客户端数据发送与接收。使用Python的`socket`模块,通过`send()`发送字节串至服务器,如`client_socket.send(message_bytes)`;用`recv()`接收数据,如`received_data = client_socket.recv(buffer_size)`。异常处理确保网络错误时程序健壮性,例如`try-except`捕获`socket.error`。理解和掌握这些基础操作对于构建稳定的TCP客户端至关重要。
1346 1
|
2月前
|
网络协议 C语言
C语言 网络编程(十三)并发的TCP服务端-以进程完成功能
这段代码实现了一个基于TCP协议的多进程并发服务端和客户端程序。服务端通过创建子进程来处理多个客户端连接,解决了粘包问题,并支持不定长数据传输。客户端则循环发送数据并接收服务端回传的信息,同样处理了粘包问题。程序通过自定义的数据长度前缀确保了数据的完整性和准确性。
|
3月前
|
网络协议 数据格式 Python
python Socket无限发送接收数据方式
Socket是指套接字,是对网络中不同主机上的应用进程之间进行双向通信的端点的一种抽象。 一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。
|
4月前
|
弹性计算 DataWorks 关系型数据库
DataWorks操作报错合集之DataX在执行过程中接收到了意外的信号15,导致进程被终止,该怎么处理
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
4月前
|
缓存 安全 Web App开发
Chrome插件实现问题之网络进程接收到URL请求后会如何解决
Chrome插件实现问题之网络进程接收到URL请求后会如何解决
|
4月前
|
SQL 自然语言处理 网络协议
【Linux开发实战指南】基于TCP、进程数据结构与SQL数据库:构建在线云词典系统(含注册、登录、查询、历史记录管理功能及源码分享)
TCP(Transmission Control Protocol)连接是互联网上最常用的一种面向连接、可靠的、基于字节流的传输层通信协议。建立TCP连接需要经过著名的“三次握手”过程: 1. SYN(同步序列编号):客户端发送一个SYN包给服务器,并进入SYN_SEND状态,等待服务器确认。 2. SYN-ACK:服务器收到SYN包后,回应一个SYN-ACK(SYN+ACKnowledgment)包,告诉客户端其接收到了请求,并同意建立连接,此时服务器进入SYN_RECV状态。 3. ACK(确认字符):客户端收到服务器的SYN-ACK包后,发送一个ACK包给服务器,确认收到了服务器的确
191 1
|
5月前
|
Java Android开发
Java Socket编程示例:服务器开启在8080端口监听,接收客户端连接并打印消息。
【6月更文挑战第23天】 Java Socket编程示例:服务器开启在8080端口监听,接收客户端连接并打印消息。客户端连接服务器,发送"Hello, Server!"后关闭。注意Android中需避免主线程进行网络操作。
100 4
|
6月前
|
算法 Linux 调度
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
462 1
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程

相关实验场景

更多