我正在努力更好地理解服务器端架构如何为WebSockets工作,目标是在嵌入式应用程序中实现它.似乎这里有3种不同的服务器端软件组件:1)服务于静态HTTP页面和处理升级请求的Web服务器,2)用于处理WebSockets通信"细节"的WebSockets库,如libwebsockets ,3)我的自定义应用程序,以实际弄清楚如何处理传入的数据.这些如何组合在一起?是否有一个单独的Web服务器和WebSocket处理部分,即WebSocket服务器/守护程序?
我的应用程序如何与Web服务器和/或WebSockets库通信以发送/接收数据?例如,使用CGI,Web服务器使用环境变量将信息发送到自定义应用程序,使用stdout接收响应.这里的等效通信系统是什么?或者您通常将WebSocket库链接到客户应用程序中?但那么如何与Web服务器通信到WebSocket库+自定义应用程序呢?或者所有3个组合成一个组件?
这就是我要问的原因.我在具有有限内存的Blackfin处理器上的uClinux/no MMU平台上使用boa Web服务器.boa中没有本机WebSocket支持,只有CGI.我试图找出如何添加WebSockets支持.我更喜欢使用编译的解决方案,而不是像JavaScript,Python或PHP这样的解释.我当前的应用程序使用CGI的长轮询,这不能为计划的增强提供足够的性能.
对于我的应用程序,我需要拦截某些 TCP/IP 数据包并通过自定义通信链接(而不是以太网)将它们路由到不同的设备。我需要所有的 TCP 控制数据包和完整的标头。我已经想出了如何使用原始套接字获取这些通过socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP));
这很好用,并允许我附加过滤器以查看我感兴趣的 TCP 端口。
但是,Linux 也会看到这些数据包。默认情况下,当它接收到一个它不知道的 TCP 端口号的数据包时,它会发送一个 RST。这不好,因为我打算稍后自己发回回复。如果我使用socket(PF_INET, SOCK_STREAM, 0);
和listen()
在同一个端口上打开第二个“正常”套接字,Linux 就会向传入的 TCP 数据包发送 ACK。这些选项都不是我想要的。我希望它不对这些数据包做任何事情,这样我就可以自己处理所有事情。我怎样才能做到这一点?