通过C中的套接字发送Server-Sent-Events

时间:2013-07-08 14:38:33

标签: c sockets server-sent-events

我有一个C应用程序,它使用server-sent-events生成我想要推送到网站的数据。

我在C中实现了一个基本的Web服务器,它在收到Http请求后发送Http-Header,然后通过套接字以1秒的间隔发送数据。

我将我的套接字注册为Event-Source并且我正在传输正确的HTTP-Header(根据Firebug),但由于某种原因,没有调用eventListener。

var source = new EventSource('http://192.168.2.113:10001/'); 

source.addEventListener('message', function(e) {
/* */
}, false); 

我尝试从php应用程序发送事件并且它没有任何问题,所以猜测问题不在javascript端。

当我在浏览器中打开http://192.168.2.113:10001/时,会显示我以1秒为间隔发送的数据字符串。

我只使用php或cgi找到了sse实现,我不想使用它。

我的回复标题:

HTTP/1.1 200 OK\n
Date: Fri, 05 Jul 2013 15:05:15 GMT\n
Cache-Control: no-cache\n
Connection: Keep-Alive\n
Transfer-Encoding: chunked\n
Content-Type: text/event-stream\n
\n

活动数据:

data: Testdata...\n\n

2 个答案:

答案 0 :(得分:2)

HTTP标头中的每一行都需要使用\r\n终止。

请参阅rfc2616第2.2节“基本规则”

   CR             = <US-ASCII CR, carriage return (13)>
   LF             = <US-ASCII LF, linefeed (10)>
     

HTTP / 1.1将序列CR LF定义为行尾标记   除了entity-body

之外的所有协议元素

您的示例只使用\n,因此标题可能看起来都是一行简单http客户端的一部分。尝试使用\r\n

更改为结束不属于实体的每一行

答案 1 :(得分:2)

chunked编码中,每个数据块前面都有一行描述块的大小。您未显示提供此尺寸,因此您的活动数据不符合chunked编码格式。

长度以十六进制指定,因此在您的情况下,18字节的数据将以十六进制编码为12。如果没有更多的块(即响应完成),则会发送0大小的块。

许多客户端将接受普通\n作为正确的数据单元终结符,但HTTP RFC指定使用\r\n。因此,标头中的每个\n都应更改为\r\n。你的块应该是这样的:

12\r\ndata: Testdata...\n\r\n

HTTP应用程序的一般规则是:对你所接受的内容持开放态度,对你发送的内容保守。此规则意味着您应编写应用程序以容忍对规范的宽松解释,但严格按照规范提供数据。