[英]erlang: how to receive HTTP/RTSP messages from socket?
我想使用Erlang管理HTTP或RTSP会话。
例如,用于RTSP协议的标准会话如下所示:
OPTIONS rtsp://192.168.1.55/test/ RTSP/1.0\r\n
CSeq: 1\r\n
User-Agent: VLC media player (LIVE555 Streaming Media v2008.07.24)\r\n
...
PLAY rtsp://192.168.1.55/test/ RTSP/1.0\r\n
CSeq: 5\r\n
Session: 1\r\n
Range: npt=0.000-\r\n
User-Agent: VLC media player (LIVE555 Streaming Media v2008.07.24)\r\n
每个消息的长度是不同的。 对于erlang, gen_server:listen
使用一个选项{active, true}
(以获取无限数量的数据)或{active, false}
(以获取固定的数据长度)。
是否有推荐的方法如何获取和解析可变长度的此类消息?
对于HTTP,请使用为inet:setopts/2
函数记录的HTTP数据包模式之一。 例如,要将套接字设置为以二进制形式接收HTTP消息,可以在套接字上设置{packet, http_bin}
。 看一下我的简单Web服务器示例,以了解如何使用HTTP数据包模式。
对于RTSP,没有内置的数据包解析器,但是由于RTSP标头是面向行的(如HTTP),因此您可以使用{packet, line}
模式进行自己的标头解析。 在这种模式下,您一次只能收到一个标头,直到您收到一个空行,表明标头的末尾。 然后,您可以将套接字更改为{packet, raw}
模式以接收任何消息正文。 Content-Length
标头(如果存在)指示任何邮件正文的大小。
您提到的{active, true}
与{active, false}
套接字模式控制数据如何到达套接字的控制进程(所有者)。
{active, true}
模式在所有数据到达后立即将其从套接字发送到控制进程。 在这种模式下,数据作为消息到达所有者的消息队列中。 在进程消息队列上接收消息非常好,因为它允许进程在处理套接字数据时也可以处理其他与套接字不相关的Erlang消息,但是{active, true}
并不经常使用,因为它不提供TCP背压发送方,因此快速发送方可能会超出接收方。 {active, false}
模式要求接收者在套接字上调用gen_tcp:recv/2,3
来检索数据。 这没有{active, true}
的背压问题,但是由于Erlang进程必须主动请求套接字数据,而不是像其他active
模式那样仅处于receive
循环中,因此它会使消息处理变得笨拙。 。 active
模式是{active, once}
和{active, N}
。 在{active, once}
模式下,接收进程一次通过其消息队列获取一条消息,套接字在每条消息之后移至被动{active, false}
模式。 要获取另一条消息,接收者必须在准备下一条消息时再次在套接字上设置{active, once}
。 此模式非常好,因为消息到达过程消息队列的方式与使用{active, true}
模式的方式相同,但是背压仍然有效。 {active, N}
模式与之类似,不同之处在于在套接字恢复为被动模式之前收到了N
消息,而不是一条消息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.