linux websocket服务器和客户端,webcosket C代码,Makefile编写

#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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌风_lwp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值