加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在C中使用zlib库对websocket permessage-deflate进行编码和

发布时间:2020-12-16 06:53:31 所属栏目:百科 来源:网络整理
导读:所有 我试图使用per-message-deflate编码WebSocket有效负载.我试图使用一些测试代码,但我的编码不正确,请你帮我. 这是我的代码: char a[180] = "{"type":"message","channel":"C04U0F9CW","text":"TestingMessage","id":757}";char b[180];ch
所有
我试图使用per-message-deflate编码WebSocket有效负载.我试图使用一些测试代码,但我的编码不正确,请你帮我.

这是我的代码:

char a[180] = "{"type":"message","channel":"C04U0F9CW","text":"TestingMessage","id":757}";
char b[180];
char c[180];
int i;
// deflate
// zlib struct
z_stream defstream;
defstream.zalloc = Z_NULL;
defstream.zfree = Z_NULL;
defstream.opaque = Z_NULL;
defstream.avail_in = (uInt)strlen(a)+1; // size of input,string + terminator
defstream.next_in = (Bytef *)a; // input char array
defstream.avail_out = (uInt)sizeof(b); // size of output
defstream.next_out = (Bytef *)b; // output char array

//deflateInit(&defstream,Z_SYNC_FLUSH);
deflateInit2(&defstream,Z_DEFAULT_COMPRESSION,Z_DEFLATED,15,8,Z_DEFAULT_STRATEGY);
deflate(&defstream,Z_SYNC_FLUSH);
deflateEnd(&defstream);
for(i=0;i<=(char*)defstream.next_out - b;i++)
{
        printf("%X",(Bytef)b[i]);
}
printf("n%sn",(Bytef *)b);
// This is one way of getting the size of the output
printf("Deflated size is: %lun",(char*)defstream.next_out - b);

我的输出是

kml@kml-VirtualBox:~/zlib-1.2.11/test$gcc test.c -lz && ./a.out 
789CAA562AA92C4855B252CA4D2D2E4E4C4F55D2514ACE48CCCB4BCD18A391B98841AB8593A873454B522B4A804221A9C5259979E9BE70D599294A56E6A6E6B5C0000FFFF2E
x??V*?,HU?R?M-.NLOU?QJ?H??K??9???Y:?EKR+J?B!??%?y??p?)JV????

Deflated size is: 72
Inflate:
73
{"type":"message","channel":"C04U0F9CW","text":"TestingMessage","id":757}

所以我期待有效载荷让我这样

AA562AA92C4855B252CA4D2D2E4E4C4F55D2514ACE48CCCB4BCD018A391B98841AB8593A8703454B522B4A804221A9C5259979E9BE70D599294A56E6A6E6B50000

This is the fiddler WebSocket traffic capture for that particular message

请帮助我获得正确的per-message-deflate编码.

Here is some more upgrade information
GET https://127.0.0.1/websoc.html HTTP/1.1
Host: mpmulti-yklu.slack-msgs.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip,deflate,br
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: permessage-deflate
Sec-WebSocket-Key: FriWg0AWhiLhLXXnfJK8kA==
Connection: keep-alive,Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket

响应

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: S2Q+O/tRM0/mIG//Er2hDdqD0eY=
Sec-Websocket-Extensions: permessage-deflate; server_no_context_takeover; client_no_context_takeover
X-Via: haproxy-ext90

解决方法

代码是正确的,但defstream.avail_in期望精确的长度,而不是额外的空字符.如果您将提供确切的输入长度,它将正常工作.试试这样吧

int l = (uInt)strlen(a);
defstream.avail_in = l; // size of input,string + terminator

请尝试了解z_stream如何分配值检查代码,然后您将更好地了解这一点.

我想很多人都在尝试解码,而且他们没有为每个消息放弃获得适当的价值.

检查你的输出

“789CAA562AA92C4855B252CA4D2D2E4E4C4F55D2514ACE48CCCB4BCD18A391B98841AB8593A873454B522B4A804221A9C5259979E9BE70D599294A56E6A6E6B5C0000FFFF2E”

这里789C是标题和0000FFFF或根据你的代码(00FFFF)是deflate消息的预告片.这里0代表00,因为你的输出是打印一个’0’而不是’00’.因为额外的一个尺码,你得到额外的5C.当您尝试下面的代码时,Thye’2E’也将被移除

int d = memcmp(msgend,&b[defstream.total_out - 4],4) ? 0 : 4;
for(i=0;i<defstream.total_out - d;i++)
{
        printf("%2X",(Bytef)b[i]);
}

所以你的预期答案是

“AA562AA92C4855B252CA4D2D2E4E4C4F55D2514ACE48CCCB4BCD018A391B98841AB8593A8703454B522B4A804221A9C5259979E9BE70D599294A56E6A6E6B50000”

根据您的输出,2个字节为0,因此根据您的代码,它将为“00”并且您的输出跟随打印每个半字节(半字节).

请尝试这对我有用,我现在能够正确解码.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读