erlang:如何从socket接收HTTP / RTSP消息?

问题描述 投票:2回答:1

我想用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 erlang rtsp otp gen-tcp
1个回答
4
投票

对于HTTP,请使用为inet:setopts/2函数记录的HTTP数据包模式之一。例如,要设置套接字以将HTTP消息作为二进制文件接收,可以在套接字上设置{packet, http_bin}。看看我的simple web server example,看看如何使用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进程必须主动请求套接字数据,而不是像其他receive模式一样坐在active循环中。
  • 你没有提到的另外两种active模式是{active, once}{active, N}。在{active, once}模式下,接收进程一次通过其消息队列获取单个消息,套接字在每条消息之后移动到被动{active, false}模式。要获得另一条消息,当接收器准备好接收下一条消息时,接收器必须再次在套接字上设置{active, once}。这种模式很好,因为消息到达进程消息队列的方式与{active, true}模式相同,但背压仍然有效。 {active, N}模式类似,只是在套接字恢复到被动模式之前接收到N消息而不是一个消息。
© www.soinside.com 2019 - 2024. All rights reserved.