[c]mosquitto编码实现websockets协议

2016-10-20 写技术

mosquitto虽然本身是支持websockets协议的,但却依懒libwebsockets库,而libwebsockets库是基于poll的,所以如果想把mosquitto改为epoll模式很容易,却不能兼容websockets了。

为了解决这个纠结的问题,这几天把websockets协议用C语言重新实现了一遍,然后将mosquitto中调用libwebsockets的部分用自己的代码取代,今天终于实现了websockets下的mqtt通讯功能。

首先一些websockets的结构放在websockets.h中:

typedef struct _WebSocketMark {
    BYTE fin:1;
    BYTE rsv1:1;
    BYTE rsv2:1;
    BYTE rsv3:1;
    BYTE opcode:4;
    BYTE mask:1;
    BYTE payloadlen:7;
} WSMark;
typedef struct _WebSocketHeader {
    WSMark mark;
    UINT64 reallength;
    unsigned char mask[4];
    unsigned short headlength;
} WSHeader;


然后一些功能函数的实现放在websockets.c中:

int shakeHands(const char* data, char* request);
int parsePack(unsigned char* buf, size_t length, WSHeader* header);
int packData(const unsigned char* message, size_t len, BYTE fin, BYTE opcode, BYTE mask, unsigned char** send, size_t* slen);
int getPackPayloadData(const int cfd, const unsigned char* buf, size_t bufsize, unsigned char* container, const WSHeader* pHeader);

然后是mosquitto中将websockets端口的监听部分放到mqtt中去,原作是在此处调用libwebsockets库中的初始化函数而不暴露新建的socket。


然后是mosquitto中有一个主循环叫mosquitto_main_loop,在这个里面会处理接收到的消息,需要增加websockets的消息处理,原作是在此处调用libwebsockets库中的函数。



标签: C linux

发表评论:

Powered by anycle 湘ICP备15001973号-1