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

前言

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


提示:紧供参考

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

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

二、代码实例

server_main主函数如下

代码如下(示例):

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 


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

你可能感兴趣的:(epoll非阻塞使用,linux,epoll,socket,c语言)