我正在使用libwebsockets库(纯 C)编写一个在 ARMv7 设备上运行的应用程序(C++11)。我正在使用 gcc 4.7.3(arm、gnueabi)和 openwrt 来构建工具链和应用程序。
因此,libwebsockets 库在连接到服务器期间会在 HTTP 请求中发送握手请求。它看起来像这样:
GET / HTTP/1.1
Pragma: no-cache
Cache-Control: no-cache
Host: 192.168.1.111
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: YDtqt/+y5Efpzo1YiCg5YQ==
Origin: /
Sec-WebSocket-Protocol: myproto
Sec-WebSocket-Extensions: deflate-fram
Sec-WebSocket-Version: 13
当我在 x86_64 linux(Fedora,gcc 4.8.1)下构建我的应用程序时,这部分工作得很好。但如果我为 ARM 构建应用程序然后运行它,HTTP 请求如下所示:
gPra ma: / HTTP/1.1
no-<ach
C chegCon rol
no<cac�e
Host: 192.168.1.111
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: QKnxtiEc3IlvyOW254h6kg==
Origin: /
Sec-WebSocket-Protocol: myproto
Sec-WebSocket-Extensions: deflate-frame
Sec-WebSocket-Version: 13
或者这个(每次都会改变):
GET / HTTP/1.1
Pragma: no-cache
Cache-Control: no-cache
tUpgoade2.168.1.111
we.soc
该应用程序的代码与 x86_64 linux 机器的代码完全相同,所以我猜问题出在库或工具链(编译器、glibc)中的某个地方。这是发出 HTTP 请求的库代码(来自client.c):
char *
libwebsockets_generate_client_handshake(struct libwebsocket_context *context,
struct libwebsocket *wsi, char *pkt)
{
char buf[128];
char hash[20];
char key_b64[40];
char *p = pkt;
int n;
n = libwebsockets_get_random(context, hash, 16);
if (n != 16) {
lwsl_err("Unable to read from random dev %s\n",
SYSTEM_RANDOM_FILEPATH);
libwebsocket_close_and_free_session(context, wsi,
LWS_CLOSE_STATUS_NOSTATUS);
return NULL;
}
lws_b64_encode_string(hash, 16, key_b64, sizeof(key_b64));
p += sprintf(p, "GET %s HTTP/1.1\x0d\x0a",
lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_URI));
p += sprintf(p, "Pragma: no-cache\x0d\x0a""Cache-Control: no-cache\x0d\x0a");
p += sprintf(p, "Host: %s\x0d\x0a", lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_HOST));
p += sprintf(p, "Upgrade: websocket\x0d\x0a""Connection: Upgrade\x0d\x0a""Sec-WebSocket-Key: ");
strcpy(p, key_b64);
p += strlen(key_b64);
p += sprintf(p, "\x0d\x0a");
if (lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_ORIGIN))
p += sprintf(p, "Origin: %s\x0d\x0a", lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_ORIGIN));
if (lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_SENT_PROTOCOLS))
p += sprintf(p, "Sec-WebSocket-Protocol: %s\x0d\x0a", lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_SENT_PROTOCOLS));
p += sprintf(p, "Sec-WebSocket-Extensions: ");
p += sprintf(p, "\x0d\x0a");
if (wsi->ietf_spec_revision)
p += sprintf(p, "Sec-WebSocket-Version: %d\x0d\x0a",
wsi->ietf_spec_revision);
// here my callback is called and I print out the header (see examples above)
context->protocols[0].callback(context, wsi,
LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER,
NULL, &p, (pkt + sizeof(context->service_buffer)) - p - 12);
p += sprintf(p, "\x0d\x0a");
return p;
}
为简洁起见,我删除了一些代码和注释。好吧,我被困在这里。找不到可以破坏整个事情的东西。有人对发生的事情有任何想法吗?可能是那双清新的眼睛能帮到我。
谢谢。