以下是使用libwebsockets-4.3.2的代码,其中包括了对lws_vhost_listen函数的替换:
#include <libwebsockets.h>
#define EXAMPLE_RX_BUFFER_BYTES (10)
static int interrupted;
// WebSocket 1回调函数
static int callback_websocket_1(struct lws *wsi, enum lws_callback_reasons reason,
void *user, void *in, size_t len)
{
switch (reason) {
case LWS_CALLBACK_ESTABLISHED:
// 处理新连接建立事件
break;
case LWS_CALLBACK_RECEIVE:
// 处理接收到消息事件
break;
case LWS_CALLBACK_CLOSED:
// 处理连接关闭事件
break;
default:
break;
}
return 0;
}
// WebSocket 2回调函数
static int callback_websocket_2(struct lws *wsi, enum lws_callback_reasons reason,
void *user, void *in, size_t len)
{
switch (reason) {
case LWS_CALLBACK_ESTABLISHED:
// 处理新连接建立事件
break;
case LWS_CALLBACK_RECEIVE:
// 处理接收到消息事件
break;
case LWS_CALLBACK_CLOSED:
// 处理连接关闭事件
break;
default:
break;
}
return 0;
}
// 主循环处理函数
static int example_main_loop(struct lws_context *context)
{
while (!interrupted) {
lws_service(context, 50);
}
return 0;
}
int main(void)
{
struct lws_context_creation_info info = {0};
struct lws_protocols protocols[3] = {0};
struct lws_context *context, *context_2;
int port_1 = 8000;
int port_2 = 9000;
// 配置WebSocket协议
protocols[0].name = "websocket-1";
protocols[0].callback = &callback_websocket_1;
protocols[1].name = "websocket-2";
protocols[1].callback = &callback_websocket_2;
protocols[2].name = NULL;
// 配置上下文创建信息
info.port = CONTEXT_PORT_NO_LISTEN; // 不监听任何端口,仅用于客户端连接
info.protocols = protocols;
// 创建WebSocket 1的上下文
context = lws_create_context(&info);
if (!context) {
lwsl_err("Failed to create WebSocket 1 context\n");
return -1;
}
// 监听WebSocket 1的端口并启动服务端
struct lws_vhost *vhost_1 =
lws_create_vhost(context, &info);
if (!vhost_1) {
lwsl_err("Failed to create WebSocket 1 vhost\n");
return -2;
}
if (lws_add_protocol(vhost_1, &protocols[0])) {
lwsl_err("Failed to add protocol to WebSocket 1 vhost\n");
return -3;
}
struct sockaddr_in sin_1 = {0};
sin_1.sin_family = AF_INET;
sin_1.sin_port = htons(port_1);
sin_1.sin_addr.s_addr = INADDR_ANY;
if (lws_vhost_listen(vhost_1, -1, (struct sockaddr *)&sin_1,
sizeof(sin_1)) == NULL) {
lwsl_err("Failed to listen on WebSocket 1 port %d\n", port_1);
return -4;
}
// 创建WebSocket 2的上下文
context_2 = lws_create_context(&info);
if (!context_2) {
lwsl_err("Failed to create WebSocket 2 context\n");
return -5;
}
// 监听WebSocket 2的端口并启动服务端
struct lws_vhost *vhost_2 =
lws_create_vhost(context_2, &info);
if (!vhost_2) {
lwsl_err("Failed to create WebSocket 2 vhost\n");
return -6;
}
if (lws_add_protocol(vhost_2, &protocols[1])) {
lwsl_err("Failed to add protocol to WebSocket 2 vhost\n");
return -7;
}
struct sockaddr_in sin_2 = {0};
sin_2.sin_family = AF_INET;
sin_2.sin_port = htons(port_2);
sin_2.sin_addr.s_addr = INADDR_ANY;
if (lws_vhost_listen(vhost_2, -1, (struct sockaddr *)&sin_2,
sizeof(sin_2)) == NULL) {
lwsl_err("Failed to listen on WebSocket 1 port %d\n", port_1);
return -8;
}
// 启动主循环处理函数,等待连接和消息处理事件发生
example_main_loop(context);
example_main_loop(context_2);
return 0;
}
在新版本的libwebsockets中,使用lws_vhost_listen函数来监听WebSocket服务端的端口。此外,在添加协议时,需要将其添加到每个vhost中,而不是上下文中。您可以在lws_create_vhost函数返回的struct lws_vhost*对象上使用lws_add_protocol函数来添加协议。
请注意,这只是一个简单的示例,实际代码可能需要进行更多配置和错误处理。




