我想使用Erlang管理HTTP或RTSP会话。
例如,RTSP协议的standart会话如下:
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} (用于获取固定长度的数据)。
是否有一种建议的方法来获取和解析这些可变长度的消息?
发布于 2019-04-06 18:12:20
对于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消息,而不是仅接收一条消息。https://stackoverflow.com/questions/55534748
复制相似问题