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

标签 c sockets server-sent-events

我有一个 C 应用程序,它生成我想使用服务器发送事件推送到网站的数据。

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

我将我的套接字注册为事件源并且我正在传输正确的 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

最佳答案

chunked 编码中,每个数据 block 前面都有一行描述 block 的大小。您没有表明您提供的是这个大小,因此您的事件数据不遵循 chunked 编码格式。

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

许多客户端会接受纯 \n 作为适当的数据单元终止符,但 HTTP RFC 指定使用 \r\n。因此, header 中的每个 \n 都应更改为 \r\n。你的 block 应该是这样的:

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

HTTP 应用程序的一般规则是:对您接受的内容开放,对您发送的内容保守。此规则意味着您应该编写应用程序以容忍对规范的松散解释,但交付的数据应严格遵守规范。

关于c - 通过 C 中的套接字发送 Server-Sent-Events,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17529421/

相关文章:

node.js - 在NestJs中使用Socket IO加入并发布到房间

ruby - 在 Ruby 中构建一个其他进程可以与之交互的 linux 服务,也许是通过套接字?

Scala:避免可变实例变量

c - 我发现在 ansi c 中使用 atoi() 方法有问题?

c - C 中的链表/指针

java - 创建客户端-服务器应用程序以回显用户发送的内容

c# - 服务器向 Nancy 发送事件

c - 有没有典型的状态机实现模式?

模拟潜艇游戏的C程序

python - Firefox 不恢复服务器发送的事件连接