cpp
复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <windows.h>
#include <libwebsockets.h>
#include <json-c/json.h>
#define MAX_JSON_SIZE 1024
static struct lws *client_conn = NULL;
static int callback_ws(struct lws *wsi, enum lws_callback_reasons reason,
void *user, void *in, size_t len)
{
switch (reason) {
case LWS_CALLBACK_CLIENT_ESTABLISHED:
printf("WebSocket Client Connection established\n");
client_conn = wsi;
break;
case LWS_CALLBACK_CLIENT_RECEIVE:
printf("Received data from server: %s\n", (char *) in);
// Parse JSON
struct json_object *jobj, *jtype;
jobj = json_tokener_parse(in);
if (jobj == NULL) {
printf("Error parsing JSON data\n");
break;
}
// Get type field
if (!json_object_object_get_ex(jobj, "type", &jtype)) {
printf("JSON object does not contain type field\n");
json_object_put(jobj);
break;
}
const char *type = json_object_get_string(jtype);
printf("Received JSON with type %s\n", type);
// Check if type is join
if (strcmp(type, "join") == 0) {
// Send response JSON with type join
char *response = "{\"type\": \"join\"}";
lws_write(client_conn, (unsigned char *) response, strlen(response), LWS_WRITE_TEXT);
}
json_object_put(jobj);
break;
case LWS_CALLBACK_CLIENT_WRITEABLE:
break;
case LWS_CALLBACK_CLOSED:
printf("WebSocket Connection Closed\n");
lws_context_destroy(wsi->context);
break;
default:
break;
}
return 0;
}
int main(int argc, char **argv)
{
WSADATA wsa_data;
int result = WSAStartup(MAKEWORD(2, 2), &wsa_data);
if (result != 0) {
printf("WSAStartup failed with error: %d\n", result);
return -1;
}
const char *server_address = "192.168.1.100";
const int server_port = 8080;
// Initiate libwebsockets
struct lws_context_creation_info info;
memset(&info, 0, sizeof(info));
info.port = CONTEXT_PORT_NO_LISTEN;
info.protocols = (struct lws_protocols[]) {
{ "ws", callback_ws, 0 },
{ NULL, NULL, 0 }
};
struct lws_context *context = lws_create_context(&info);
if (context == NULL) {
printf("Error creating websocket context\n");
return -1;
}
// Connect to server
struct lws_client_connect_info connect_info;
memset(&connect_info, 0, sizeof(connect_info));
connect_info.context = context;
connect_info.address = server_address;
connect_info.port = server_port;
connect_info.path = "/";
connect_info.host = connect_info.address;
connect_info.ietf_version_or_minus_one = -1;
connect_info.ssl_connection = 0;
connect_info.client_exts = NULL;
connect_info.method = "GET";
struct lws *conn = lws_client_connect_via_info(&connect_info);
if (conn == NULL) {
printf("Error connecting to server\n");
return -1;
}
// Wait for connection to be established
while (client_conn == NULL) {
lws_service(context, 0);
}
printf("Connected to server\n");
// Wait for data to be received
while (true) {
lws_service(context, 0);
}
lws_context_destroy(context);
return 0;
}