Exbuffer.c
纯C写的TCP中的粘包、分包问题的解决方案
Install / Use
/learn @play175/Exbuffer.cREADME
exbuffer.c
设计目标是一个纯C的网络协议缓冲器,该协议简单介绍:
协议包分为包头和包体:包长采用2个字节或者4个字节,用来表示本次数据包中包体的长度
接受到数据就存储在缓冲区,缓冲区动态扩展以保证可以足够存储。
当接收到一个以上完整的数据包就调用回调函数recvHandle。
#include "exbuffer.h"
void recvHandle(unsigned char *rbuf,size_t len)
{
printf("收到数据:%d\n",len);
exbuffer_printHex(rbuf,len);
}
int main(int argc, char **argv)
{
exbuffer_t* value;
value = exbuffer_new();
//value->headLen = 2;//设置包头长度,默认是2(2、4分别对应short和int,可表示65535/以及2~32次方长度的数据)
value->recvHandle = recvHandle;
//test ntohl
//printf("%d\n",ntohl(1,EXBUFFER_LITTLE_ENDIAN));
unsigned char buf[] = {0,2,3,4,0,1,5,0};
exbuffer_put(value,(unsigned char*)buf,0,8);
unsigned char buf2[] = {3};
exbuffer_put(value,(unsigned char*)buf2,0,1);
unsigned char buf3[] = {6,6,6};
exbuffer_put(value,(unsigned char*)buf3,0,3);
//printf("有效数据长度:%d\n",exbuffer_getLen(value));
//printf("缓冲区长度:%d\n",value->bufferlen);
printf("缓冲区:\n");
exbuffer_dump(value,value->bufferlen);
exbuffer_free(&value);
//system("pause");
//getchar();
return EXIT_SUCCESS;
}
nodejs版本的exbuffer:https://github.com/play175/ExBuffer
对C不熟悉,第一次写C代码,可能很多不合理的地方,欢迎批评指正!
我的博客:http://yoyo.play175.com/
Related Skills
node-connect
351.2kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
110.6kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
351.2kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
351.2kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
