首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >erlang:如何从套接字接收HTTP/RTSP消息?

erlang:如何从套接字接收HTTP/RTSP消息?
EN

Stack Overflow用户
提问于 2019-04-05 11:50:53
回答 1查看 326关注 0票数 3

我想使用Erlang管理HTTP或RTSP会话。

例如,RTSP协议的standart会话如下:

代码语言:javascript
复制
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} (用于获取固定长度的数据)。

是否有一种建议的方法来获取和解析这些可变长度的消息?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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消息,而不是仅接收一条消息。
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55534748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档