我正在尝试在设备上创建一个通过端口8000与 HTTP 通信的服务器、使用具有以下配置的代码: 网络配置网络任务
```
Clock_Params_init (&instanceParams);
instanceParams.startFlag = STD_true;
instanceParams.period = 100;
(void) Clock_create (llTimerTick、instanceParams.period、&instanceParams、NULL);
NC_SystemOpen ((INT32S) NC_PRIVATE_LOW、(INT32S) NC_OPMODE_INTERRUPT);
hCfgIpAddr = CfgNew();
web_vAddFiles();
/*设置手动 IP 地址*/
CfgAddEntry (hCfgIpAddr、 CFGTAG_SYSINFO、CFGITEM_DHCP_HOSTNAME 、0U、(INT32S) strlen (s8HostNameArray)、 (INT8U *)(s8HostNameArray)、STD_NULL);
bzero (&objstrIPNetType、sizeof (objstrIPNetType));
CfgAddEntry (hCfgIpAddr、CFGTAG_IPNet、(INT32U) 1、0U、(INT32S) sizeof (CI_IPNet)、 (INT8U *)&objstrIPNetType、STD_NULL);
CfgAddEntry (hCfgIpAddr、CFGTAG_route、0U、0U、(INT32S) sizeof (CI_route)、 (INT8U *)&objstrRouteType、STD_NULL);
/*指定 HTTP 服务*/
CI_SERVICE_HTTP objstrHTTPServiceType;
bzero (&objstrHTTPServiceType、sizeof (objstrHTTPServiceType));
objstrHTTPServiceType.cisargs.ipaddr = inet_addr ("INADDR_ANY");
objstrHTTPServiceType.cisargs.pCbSrv=Soad_vNetworkStatusChangeHook;
objstrHTTPServiceType.cisargs.IfIdx = 1;
objstrHTTPServiceType.param.MaxCon = 8;
objstrHTTPServiceType.param.Port = 8000;
CfgAddEntry (hCfgIpAddr、\
CFGTAG_SERVICE、\
CFGITEM_SERVICE_HTTP、\
0u、\
(INT32S) sizeof (objstrHTTPServiceType)、\
(INT8U *)&objstrHTTPServiceType、\
STD_NULL);
/*init TCP 配置*/
s32TransmitBufSize = 1024;
(void) CfgAddEntry (hCfgIpAddr、\
CFGTAG_IP、\
CFGITEM_IP_SOCKTCPTXBUF、\
CFG_ADDMODE_UNIQUE、\
(INT32S) sizeof (INT32U)、\
(INT8U *)&s32TransmitBufSize、\
STD_NULL);
s32ReceiveBufSize = 1024;
(void) CfgAddEntry (hCfgIpAddr、\
CFGTAG_IP、\
CFGITEM_IP_SOCKTCPRXBUF、\
CFG_ADDMODE_UNIQUE、\
(INT32S) sizeof (INT32U)、\
(INT8U *)&s32ReceiveBufSize、\
STD_NULL);
s32ReceiveBufLimit = 2048;
(void) CfgAddEntry (hCfgIpAddr、\
CFGTAG_IP、\
CFGITEM_IP_SOCKTCPRXLIMIT、\
CFG_ADDMODE_UNIQUE、\
(INT32S) sizeof (INT32U)、\
(INT8U *)&s32ReceiveBufLimit、\
STD_NULL);
/*添加了 NDK 低优先级任务堆栈大小的配置设置。 */
s32NewValue = 1200;
(void) CfgAddEntry (hCfgIpAddr、\
CFGTAG_OS、\
CFGITEM_OS_TASKSTKLOW、\
CFG_ADDMODE_UNIQUE、\
(INT32S) sizeof (INT32U)、\
(int8U *)&s32NewValue、\
STD_NULL);
/*添加 NDK 标准优先级任务堆栈大小的配置设置。 */
s32NewValue = 1024;
(void) CfgAddEntry (hCfgIpAddr、\
CFGTAG_OS、\
CFGITEM_OS_TASKSTKNORM、\
CFG_ADDMODE_UNIQUE、\
(INT32S) sizeof (INT32U)、\
(int8U *)&s32NewValue、\
STD_NULL);
/*添加 NDK 高优先级任务堆栈大小的配置设置。 */
s32NewValue = 2048;
(void) CfgAddEntry (hCfgIpAddr、\
CFGTAG_OS、\
CFGITEM_OS_TASKSTKHIGH、
CFG_ADDMODE_UNIQUE、\
(INT32S) sizeof (INT32U)、\
(int8U *)&s32NewValue、\
STD_NULL);
正确
{
s32ReturnStatus = NC_NetStart (hCfgIpAddr、\
Soad_vNetworkOpenHook、\
Soad_vNetworkCloseHook、\
Soad_vNetworkIPAddressChangeHook);
}while (s32ReturnStatus >0);
/*调用用户定义的堆栈删除挂钩*/
web_vRemoveFiles();
/*删除配置*/
CfgFree (hCfgIpAddr);
/*关闭操作系统*/
nc_SystemClose ();
```
并添加了 Web 文件、按如下方式添加和删除挂钩
```
addWebFiles (){
efs_CreateFile ("index.html"、index_size、(INT8U *) index);
efs_CreateFile ("Web_u8WebServerCGI、0"、0、(INT8U *) Web_u8WebServerCGI);
}
removeWebFiles (){
efs_destroyfile ("index.html");
efs_destroyfile ("Web_u8WebServerCGI.cgi");
}
```
并按如下所示设置 NDK 任务的优先级
```
global.lowTaskPriLevel = 8;
Global.normTaskPriLevel = 10;
global.highTaskPriLevel = 12;
global.kerntaskPriLevel = 14;
```
我收到一个错误
网络::ERR_INVALID_HTTP_RESPONSE
我试着找出出现这个错误的原因,所以我用 Wireshark 来列出服务器(10.1.0.204)我的设备和客户端(10.1.0.203)我的 PC 之间的所有流量。
否。 | 时间 | 源 | 目标 | 协议 | 长度 | 信息 |
4712 | 133.8418 | 10.1.0.203 | 10.1.0.204 | TCP | 66 | 57911 > 8000 [SYN] SEQ=0 Win=64240 Len=0 MSS=1460 WS=256 SACK_PERM |
4715 | 133.8427 | 10.1.0.204 | 10.1.0.203 | TCP | 60 | 8000 > 57911 [SYN、ACK] Seq=0 Ack=1 Win=1024 Len=0 MSS=1460 |
4716 | 133.8428 | 10.1.0.203 | 10.1.0.204 | TCP | 54 | 57911 > 8000 [ACK] Seq=1 Ack=1 Win=64240 len=0 |
4717 | 133.843 | 10.1.0.203 | 10.1.0.204 | HTTP | 496 | Post /Web_u8WebServerCGI HTTP/1.1 (文本/普通) |
4718 | 133.8447 | 10.1.0.204 | 10.1.0.203 | TCP | 60 | 8000 > 57911 [ACK] Seq=1 Ack=443 Win=582 Len=0 |
4719 | 133.948 | 10.1.0.204 | 10.1.0.203 | TCP | 61 | 8000 > 57911 [PSH、ACK] Seq=1 Ack=443 Win=1024 Len=7 [重新组装的 PDU] |
4720 | 133.9481 | 10.1.0.204 | 10.1.0.203 | TCP | 60 | 8000 > 57911 [PSH、ACK] Seq=8 Ack=443 Win=1024 Len=3 [重新组装的 PDU]的 TCP 段 |
4721 | 133.9482 | 10.1.0.203 | 10.1.0.204 | TCP | 54 | 57911 > 8000 [ACK] Seq=443 Ack=11 Win=64230 Len=0 |
4722 | 133.9485 | 10.1.0.204 | 10.1.0.203 | TCP | 60 | 8000 > 57911 [PSH、ACK] Seq=11 Ack=443 Win=1024 Len=3 [重新组装的 PDU]的 TCP 段 |
4723 | 133.9485 | 10.1.0.203 | 10.1.0.204 | TCP | 54 | 57911 > 8000 [FIN、ACK] Seq=443 Ack=11 Win=64230 Len=0 |
4724 | 133.9485 | 10.1.0.203 | 10.1.0.204 | TCP | 54 | 57911 > 8000 [RST、ACK] Seq=444 Ack=14 Win=0 Len=0 |
4725 | 133.9488 | 10.1.0.204 | 10.1.0.203 | TCP | 60 | 8000 > 57911 [PSH、ACK] Seq=14 Ack=443 Win=1024 Len=3 [重新组装的 PDU] |
4726 | 133.9488 | 10.1.0.203 | 10.1.0.204 | TCP | 54 | 57911 > 8000 [RST] Seq=443 Win=0 Len=0 |
4727 | 133.9491 | 10.1.0.204 | 10.1.0.203 | TCP | 60 | 8000 > 57911 [PSH、ACK] Seq=17 Ack=443 Win=1024 Len=3 [重新组装的 PDU] |
4728 | 133.9491 | 10.1.0.203 | 10.1.0.204 | TCP | 54 | 57911 > 8000 [RST] Seq=443 Win=0 Len=0 |
4729 | 133.9493 | 10.1.0.204 | 10.1.0.203 | TCP | 60 | 8000 > 57911 [PSH、ACK] Seq=20 Ack=443 Win=1024 Len=3 [重新组装的 PDU] |
4730 | 133.9493 | 10.1.0.203 | 10.1.0.204 | TCP | 54 | 57911 > 8000 [RST] Seq=443 Win=0 Len=0 |
4731 | 133.9497 | 10.1.0.204 | 10.1.0.203 | TCP | 60 | 8000 > 57911 [PSH、ACK] Seq=23 Ack=443 Win=1024 Len=3 [重新组装的 PDU]的 TCP 段 |
4732 | 133.9497 | 10.1.0.203 | 10.1.0.204 | TCP | 54 | 57911 > 8000 [RST] Seq=443 Win=0 Len=0 |
4733 | 133.9604 | 10.1.0.204 | 10.1.0.203 | TCP | 513 | 8000 > 57911 [PSH、ACK] Seq=26 Ack=444 Win=1024 Len=459 [重新组装的 PDU]的 TCP 段 |
4734 | 133.9604 | 10.1.0.203 | 10.1.0.204 | TCP | 54 | 57911 > 8000 [RST] SEQ=444 Win=0 Len=0 |
因此、从这个表中、我发现服务器继续发送数据包、而不 对通过客户端发送的数据包进行跟踪
此外、我的 TI-RTOS 版本为 2.16.1.14
该用例 NDK 版本 2_25_00_09
我注意到在指定的端口8000上成功地出现了 HTML (index.html)的 GET 请求、但请求 POST /Web_u8WebServerCGI 时出现了问题
我还注意到 Web_u8WebServerCGI 正在成功调用、并且创建了响应并成功传递到 NDK、但 出现了错误 ERR_INVALID_HTTP_RESPONSE、客户端无法解析响应。
但是对于端口80、一切都正常
那么、如何解决该问题呢?