功能逻辑需求如下:
客户端A通过tcp socket长连接给中间服务器B发送消息, 中间服务器B通过libwebsockets库采用ws协议向 WS服务器C 转发数据:
中间服务器B代码如下: 在单线程中,先监听一个tcp socket,等待客户端A连上来, 客户端A会不定时往 tcp_fd 发送数据,B要怎样将tcp_fd的收发事件加入到libwebsockets的事件列表中,
使得B在while ( 1 ) {}循环里面既能处理ws的callback,又能及时处理 tcp_fd 的收发数据? 如果每次等到 lws_service(context, 5) 超时出来之后,再处理tcp_fd的数据,感觉不够及时,对libwebsockets不熟悉,
不知道怎样添加自定义socket读写事件到libwebsockets中,请教一下大家
int callback(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len) {
struct session_data *data = (struct session_data *) user;
switch (reason) {
case LWS_CALLBACK_CLIENT_ESTABLISHED:
lwsl_notice("Connect ok!\n");
break;
case LWS_CALLBACK_CLIENT_RECEIVE:
break;
case LWS_CALLBACK_CLIENT_WRITEABLE:
break;
}
return 0;
}
struct lws_protocols protocols[] = {
{
"ws", callback, sizeof(struct session_data), MAX_PAYLOAD_SIZE,
},
{
NULL, NULL, 0
}
};
int main() {
int listenfd, tcp_fd;
struct sockaddr_in server_addr, client_addr;
socklen_t sin_size;
char buffer[1024];
int n;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY; // 监听所有IP地址的连接请求
server_addr.sin_port = htons(8080); // 端口号8080
if (bind(listenfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
perror("bind");
exit(1);
}
listen(listenfd, 5); // 监听5个连接请求
sin_size = sizeof(client_addr); // 客户端地址结构的大小
tcp_fd = accept(listenfd, (struct sockaddr *)&client_addr, &sin_size); // 接受连接请求并获取新的文件描述符
........................
........................
struct lws_context_creation_info ctx_info = { 0 };
ctx_info.port = CONTEXT_PORT_NO_LISTEN;
ctx_info.iface = NULL;
ctx_info.protocols = protocols;
ctx_info.gid = -1;
ctx_info.uid = -1;
struct lws_context *context = lws_create_context(&ctx_info);
char address[] = "abc.com";
int port = 443;
char addr_str[256] = { 0 };
sprintf(addr_str, "%s", address );
struct lws_client_connect_info conn_info = { 0 };
conn_info.context = context;
conn_info.address = address;
conn_info.port = port;
conn_info.ssl_connection = 1;
conn_info.path = "/";
conn_info.host = addr_str;
conn_info.origin = addr_str;
conn_info.protocol = protocols[0].name;
struct lws *wsi = lws_client_connect_via_info(&conn_info);
while ( 1 ) {
lws_service(context, 5);
lws_callback_on_writable(wsi);
}
lws_context_destroy(context);
return 0;
}