websocket服务使用epoll非阻塞模式下接收数据含掩码粘包解包demo

本文介绍了在C语言中使用epoll非阻塞模式下,WebSocket服务如何处理含掩码的粘包问题。通过提供代码实例,展示了服务器接收客户端数据的解决方案,特别指出该示例仅关注读取数据的丢包粘包问题,不包含心跳和数据发送部分。epoll非阻塞模式的优势和适用场景也进行了简单讨论。
摘要由CSDN通过智能技术生成

前言

通过对epoll的实战应用以及官方说明,对该模式下的网络编程钦佩不已,下面是关于websocke通信下服务接收客户端的实例demo以及前期开发中遇到的问题


提示:紧供参考

一、c语言websocket服务使用epoll非阻塞模式下接收数据含掩码粘包问题?

注意:该demo只针对数据的读入丢包粘包问题,若加入心跳和数据发送需对该demo进行进一步改进,非常抱歉不能将完整的项目代码发与大家分享还请理解

二、代码实例

server_main主函数如下

代码如下(示例):

#include <sys/socket.h>
#include <sys/epoll.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>


int nread;
int length;
int hmi_fd;
typedef void (*a)(void);
typedef struct hmievent
{
   
    a p;
    void *ptr;
    int sockfd;
} HMI_EVENT_T;
void sock_handler(void);
//数据解包
char *de_package(const char *buffer, const int buf_len)
{
   
    int i = 0;
    char fin;
    char mask_flag;
    char masks[4];
    char *payload_data = NULL;
    char temp[8];
    unsigned int n;
    unsigned int payloadLen = 0, dataStart = 2;
    if (buf_len < 2)
    {
   
        DLOGD("buf_len less than 2.\n");
        return NULL;
    }

    fin = (buffer[0] & 0x80) == 0x80; // 1bit,1表示最后一帧
    if (!fin)
    {
   
        DLOGD("fin is error.\n");
        return NULL; // 超过一帧暂不处理
    }

    mask_flag = (buffer[1] & 0x80) == 0x80; // 是否包含掩码
    if (!mask_flag)
    {
   
        DLOGD("no mask.\n");
        return NULL; // 不包含掩码的暂不处理
    }

    payloadLen = buffer[1] & 0x7F; // 数据长度
    DLOGD("PAYLOADLEN length=%lu", payloadLen);
    if (payloadLen == 126)
    {
   
        memcpy(masks, buffer + 4, 4);
        payloadLen = (buffer[2] & 0xFF) << 8 | (buffer[3] &a
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值