主题中讨论的其他器件:CC3235MODSF
您好!
我们正在使用 CC3235MODSF 和最新的 Simplelink SDK 版本:6.10.00.05进行开发。 我们正在应用程序中使用 HTTP GET 和 POST 请求。
在比较 Wireshark 捕获的通过 CC3235MODSF 和 Postman 发送这些请求时、我们意识到 CC3235MODSF 正在发送额外的 HTTP "继续"数据包。 该数据包基本上是在实际 HTTP 请求后向服务器发送 CRLF (2字节):
下面是 Wireshark 上的不同屏幕截图:
在查看了 httpclient.c 中的代码后、我可以看到 HttpClient_sendRequest 函数调用静态 sendRequest 函数、在该函数中、发送正文的部分如下:
/* in case a body exists send it */ if(body) { /* In case of chunk, add the chunk length add the beginning of the body */ if ((flags & HTTPClient_CHUNK_START) || (getCliState(cli, CHUNKED_REQ_STATE))) { ret = sprsend(cli, 0, "%x \r\n",bodyLen); if (ret < 0) { return (ret); } } /* Send the buf */ ret = sprsend(cli, SENDBUF,NULL); if (ret < 0) { return (ret); } /* Send the body payload */ while(bytesToSend != 0) { ret = SlNetSock_send(cli->ssock, bodyPtr, bytesToSend, 0); if (ret < 0) { return (ret); } bytesToSend-=ret; if (ret < bytesToSend) { bodyPtr+=ret; } } ret = sprsend(cli, 0, "\r\n"); if (ret < 0) { return (ret); } if (flags & HTTPClient_CHUNK_START) { setCliState(cli,CHUNKED_REQ_STATE,true); } else if (flags & HTTPClient_CHUNK_END) { ret = sprsend(cli, 0, "0\r\n\r\n"); if (ret < 0) { return (ret); } setCliState(cli,CHUNKED_REQ_STATE,false); waitBlocked = true; } /* Send the buffer */ ret = sprsend(cli, SENDBUF,NULL); if (ret < 0) { return (ret); } } else { /* There is no body, send the start line and headers */ ret = sprsend(cli, SENDBUF,NULL); if (ret < 0) { return (ret); } }
您可以在上面的第33行(httpclient.c 上的第2263行)上看到有一个使用 CRLF 进行 sprintd 的调用。 如果我注释此行、我将不再看到额外的 CRLF 继续数据包。
那么、我们为什么要使用这行代码呢? 这是错误吗? 请求分块时是否需要此数据包? 如果没有必要、我看不到发送额外字节数据的任何原因。
非常感谢你的帮助。
最棒的
欧格尔肯