#include <libwebsockets.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define PORT 7681
#define SERVER_ADD "10.10.91.162"; // 服务器地址
// WebSocket 消息处理回调函数
static int callback_websocket(struct lws *wsi, enum lws_callback_reasons reason,
void *user, void *in, size_t len)
{
struct sockaddr_in peer_addr;
socklen_t peer_len = sizeof(peer_addr);
char ip_str[1024];
char *peer_ip;
switch (reason)
{
case LWS_CALLBACK_ESTABLISHED:
printf("WebSocket server connection established.\n");
break;
case LWS_CALLBACK_RECEIVE:
if (getpeername(lws_get_socket_fd(wsi), (struct sockaddr *)&peer_addr, &peer_len) == 0)
{
inet_ntop(AF_INET, &(peer_addr.sin_addr), ip_str, sizeof(ip_str));
printf("Client connected from IP: %s\n", ip_str);
}
else
{
perror("getpeername failed");
}
printf("AAAAReceived user: %s\n", (char *)user);
printf("AAAAReceived message: %s\n", (char *)in);
// 回应客户端
char msg[] = "Hello, Client!";
int len = strlen(msg);
unsigned char *buffer = (unsigned char *)malloc(LWS_PRE + len);
memcpy(buffer + LWS_PRE, msg, len);
lws_write(wsi, buffer + LWS_PRE, len, LWS_WRITE_TEXT);
free(buffer);
break;
case LWS_CALLBACK_CLOSED:
printf("WebSocket client disconnected.\n");
break;
default:
break;
}
return 0;
}
// 配置 WebSocket 服务器连接协议
static struct lws_protocols protocols[] = {
{
"l", // 协议名称
callback_websocket, // 回调函数
0, // 对于 WebSocket 的私有数据
150, // 每个消息的最大大小
},
{NULL, NULL, 0, 0} // 结束标志
};
int main(int argc, char **argv)
{
int i = 0;
struct lws_context_creation_info info;
struct lws_context *context;
memset(&info, 0, sizeof(info));
info.port = PORT; // WebSocket 服务器端口
info.protocols = protocols; // 指定协议
info.gid = -1;
info.uid = -1;
// 创建 WebSocket 上下文
context = lws_create_context(&info);
if (context == NULL)
{
printf(stderr, "libwebsocket init failed\n");
return -1;
}
// 进入事件循环,等待客户端连接
while (1)
{
lws_service(context, 100); // 每 100 毫秒处理一次事件
printf("%d\r\n", i);
i++;
}
// 清理 WebSocket 上下文
lws_context_destroy(context);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libwebsockets.h>
#define PORT 7681
#define SERVER_ADD "10.10.91.162"; // 服务器地址
// static const char *test_url = "ws://echo.websocket.org"; // WebSocket 服务器 URL
void send_message(struct lws *wsi, const char *msg)
{
int len = strlen(msg);
unsigned char *buffer = (unsigned char *)malloc(LWS_PRE + len);
memcpy(buffer + LWS_PRE, msg, len);
lws_write(wsi, buffer + LWS_PRE, len, LWS_WRITE_TEXT);
free(buffer);
printf("Sent message: %s\n", msg);
}
// 用于处理 WebSocket 消息的回调函数
static int callback_echo(struct lws *wsi, enum lws_callback_reasons reason,
void *user, void *in, size_t len)
{
switch (reason)
{
case LWS_CALLBACK_CLIENT_ESTABLISHED:
printf("WebSocket connection established\n");
send_message(wsi, "AADSD,ssd");
//lws_callback_on_writable(wsi);//发送启动
break;
case LWS_CALLBACK_CLIENT_RECEIVE:
printf("Received message: %s\n", (char *)in);
break;
case LWS_CALLBACK_CLIENT_WRITEABLE:
// 连接建立后发送消息
{
char msg[] = "Hello, WebSocket!";
int len = strlen(msg);
unsigned char *buffer = (unsigned char *)malloc(LWS_PRE + len);
memcpy(buffer + LWS_PRE, msg, len);
lws_write(wsi, buffer + LWS_PRE, len, LWS_WRITE_TEXT);
free(buffer);
//printf("Sent message: %s\n", msg);
//lws_callback_on_writable(wsi);//发送启动
sleep(1);
}
break;
case LWS_CALLBACK_CLIENT_CLOSED:
printf("WebSocket connection closed\n");
break;
default:
break;
}
return 0;
}
// WebSocket 客户端连接信息
static struct lws_protocols protocols[] = {
{
"l", // 协议名称
callback_echo, // 回调函数
0, // 用户数据大小
150 // 默认最大消息大小
},
{NULL, NULL, 0, 0} // 必须有终结符
};
int main(int argc, char **argv)
{
struct lws_context_creation_info info;
struct lws_client_connect_info i;
struct lws_context *context;
struct lws *wsi;
// 初始化 libwebsockets
memset(&info, 0, sizeof(info));
info.port = CONTEXT_PORT_NO_LISTEN; // 客户端不需要监听端口
info.protocols = protocols;
info.gid = -1;
info.uid = -1;
// 创建 lws context
context = lws_create_context(&info);
if (!context)
{
printf(stderr, "libwebsockets init failed\n");
return 1;
}
// 设置 WebSocket 客户端连接信息
memset(&i, 0, sizeof(i));
i.context = context;
i.address = SERVER_ADD; // WebSocket 服务器地址
i.port = PORT; // WebSocket 服务器端口 (ws 默认端口是 80)
i.path = "/"; // WebSocket 请求的路径
i.host = SERVER_ADD; // WebSocket 服务器 host
i.origin = SERVER_ADD; // WebSocket 服务器 origin
i.protocol = protocols[0].name; // 协议名称
i.ssl_connection = 0; // 不使用 SSL(可以设置为 1 来使用 wss)
// 发起 WebSocket 连接
wsi = lws_client_connect_via_info(&i);
if (!wsi)
{
printf(stderr, "WebSocket connection failed\n");
return 1;
}
// 事件循环,处理连接和消息
while (1)
{
int n = lws_service(context, 100); // 100 毫秒超时
if (n < 0)
{
printf("出错了\r\n");
break; // 发生错误,退出
}
//send_message(wsi, "123");
}
// 关闭 context 并清理资源
lws_context_destroy(context);
return 0;
}
# 编译器和标志
CC = gcc
CFLAGS = -Wall -O2
INCLUDE = -I./include -I./include/libwebsockets
# 库文件路径
LIBRARY_PATH = ./lib
LIBRARY = -lwebsockets -lsystemd # 静态库的库名(不需要指定 .a 后缀)
# 源文件和目标文件
SRC = main.c
OBJ = main.o
# 最终目标可执行文件
TARGET = api
# 默认目标
all: $(TARGET)
# 生成目标文件
$(TARGET): $(OBJ)
$(CC) $(OBJ) -L$(LIBRARY_PATH) $(LIBRARY) -o $(TARGET)
# 编译 main.c
main.o: main.c
$(CC) $(CFLAGS) $(INCLUDE) -c main.c -o main.o
# 清理编译生成的文件
clean:
rm -f $(OBJ) $(TARGET)