前言
通过对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