This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C129XNCZAD:端口号为8000的 HTTP 服务器出现问题

Guru**** 664280 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1224921/tm4c129xnczad-issue-with-http-server-with-port-number-8000

器件型号:TM4C129XNCZAD

我正在尝试在设备上创建一个通过端口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、一切都正常

那么、如何解决该问题呢?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     我现在不在办公室。 我明天会回到你的问题。 很抱歉响应延迟。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     我对 HTTP 和 NDK 都不是很熟悉。  官方 HTTP 端口应为80。 为什么要使用8000而不是80? 参阅  https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers#References_and_notes

     您能否查看这篇可能有用的文章?  

    https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/691279/rtos-ti-rtos-http-server-post-file-example

     另请查看 Todd 提供的 HTTP 服务器示例。  

    https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/947315/faq-tm4c1294kcpdt-do-you-have-an-example-of-a-http-server-on-a-tivac-device-running-ti-rtos-sys-bios

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Charles、您的回答。

    在彻底检查所有 XDC 配置并审查我的代码后、我无法确定问题的确切原因。 然而,我确实取得了一些进展。 我有一个功能 HTML 和 JavaScript 示例代码,可以在端口80和8089上使用,遵循相同的原则,并使用 web 套接字。

    当我用原始 HTML 和 JavaScript 文件替换示例代码时、遇到了一个问题、即代码在端口80上能够正常工作。 CGI 成功接收并响应数据。 但是、在使用 Chrome 和 Postman 进行测试时、收到以下错误消息:net:ERR_INVALID_HTTP_RESPONSE。

    为了进一步研究、我使用了 Wireshark 来分析以太网上的 TCP 消息。 我注意到,发出的请求和收到的答复完全相同。

    尽管做出了这些努力、但我仍然无法确定网络的具体原因::ERR_INVALID_HTTP_RESPONSE 错误。 我已经检查了 XDC 配置、检查了代码、并分析了网络流量。 但仍无法找出原因。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    电路板在网络上也像在端口80上一样正确地响应端口8080、但客户端终止连接并发出以下错误  网::ERR_INVALID_HTTP_RESPONSE 、即使数据存在或者这是我在使用 Wireshark 的以太网连接上看到的数据也是如此。我还尝试 添加 允许在端口8080上进行传入和传出连接的连接规则、以便在防火墙阻止它或其他情况但问题仍然存在的情况下使用。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Hazem、

     我不知道是什么原因导致了这个问题。  

    我有一个功能 HTML 和 JavaScript 示例代码,该代码在端口80和8089上均可使用,遵循相同的原则并使用 web 套接字。

    我假设您已经在 MCU 上运行了这个函数 HTML 和 JS 示例代码、对吗? 它还在其他平台上运行呢?

    当我用原始 HTML 和 JavaScript 文件替换示例代码时,我遇到了一个问题,代码在端口80上可以正常运行。

    函数示例代码与您的原始 HTML 和 JS 之间的确切差异是什么?

    但是、在使用 Chrome 和 Postman 进行测试时、收到以下错误消息:net:ERR_INVALID_HTTP_RESPONSE。

    为了进一步研究、我使用了 Wireshark 来分析以太网上的 TCP 消息。 我注意到,发出的请求和收到的答复完全相同。

    [/报价]

    首先、 ERR_INVALID_HTTP_RESPONSE 是客户端到服务器的响应导致的问题、对吗?

    您可以通过逐字节比较数据包来更详细地比较请求和响应。 示例代码和您自己的代码之间的关系是否完全相同?

    电路板在网络上也像在端口80上一样对端口8080正确响应,但客户端终止连接并发出此错误  网:ERR_INVALID_HTTP_RESPONSE

    您能否再次说明一下、此错误消息是您在客户端的 PC 浏览器上看到的错误消息吗? 或者、这是您在客户端未响应时在 CCS 控制台上看到的内容?  

    您是否尝试过家庭网络等其他网络? 我想知道它是否会在不同的网络上有所不同。 如果您有交换机、则可以配置交换机进行端口转发、以便 Wireshark 可以捕获发送/接收到 MCU 的所有信息。  

    [/quote]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    html 和 js 代码位于 MCU 上且正确请求了、但我从 Chrome 控制台发出的 CGI 请求除外、如下所示

    fetch("">10.1.0.204:8080/Web_u8WebServerCGI.cgi", {
      method: "POST",
      headers: {
        "Content-Type": "text/plain;charset=UTF-8",
        "Authorization": "Basic YWRtaW46YWRtaW4="
      },
      body: "Mode=1,CMD=18,0,"
    })
      .then(response => {
        if (response.ok) {
          console.log("Ready");
          return response.text();
        } else {
          console.log("Error");
        }
      })
      .then(data => {
        console.log(data);
      })
      .catch(error => {
        console.log("Error:", error);
      });



    CGI 函数是一种

    static INT8U Web_u8WebServerCGI(void *pvCGISocketData, INT32S s32RXMsgLength)
    {
        vValidateCGISocketInfo(pvCGISocketData, &objstrWebSocketInfo);
        httpSendClientStr(pvCGISocketData, "[[32],[82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99],[102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119],[[39,\"F\"]],[[60,\"Board Settings\",0,0,\"(111)\",\"sb18\",0,0,1],[0,0,5,\"b1\",\"Serial Number\",1,0,1,21285772,5,\"b2\",\"Firmware Version\",1,1,1,\"02.00.af.00.00.00.00\",5,\"b3\",\"MAC Address\",1,1,1,\"c4-7c-8d-00-0d-1e\",5,\"b4\",\"Downloading XML Version\",1,1,1,\"9.4.21.2.2.1\",5,\"b5\",\"Protocol Number\",1,1,1,\"6.11.20.9.17.2\",5,\"b6\",\"Configuration Version\",1,1,1,3]]]");
        
        return (1);
    }


    此外、CGI 函数大约需要200ms 来响应和准备这个字符串  
    所有 NDK 堆栈都配置有 IP:10.1.0.204和 httpport:80、我会在运行时更改这些地址并重新启动 NDK
    用新端口设置加载


     在 Chrome 控制台上收到以下网络::ERR_INVALID_HTTP_RESPONSE 错误执行 JS 代码之后、当我使用 Postman 发送 CGI 请求时会发生相同的行为

    我认为问题不是在内容本身,因为它与端口80正常工作,但  

    我比较了端口80 (工作中)和8080 (不工作!!)的请求

    这是端口80的 ASCII 消息

    从 WebClient 发送到服务器的请求为红色
     从服务器发送到 WebClient 的消息为蓝色

    Post /Web_u8WebServerCGI.cgi HTTP/1.1
    主机:10.1.0.204
    连接:保持活动
    内容长度:16
    授权:基本 YWRtaW46YWRtaW4=
    用户代理:Mozilla/5.0 (Windows NT 10.0;Win64;x64) AppleWebKit/537.36 (KHTML、如 Gecko) Chrome/113.0.0.0 Safari / 537.36
    Content-Type:text/plain;charset=UTF-8
    接受:*/*
    来源:http://10.1.0.204
    推荐人:http://10.1.0.204/
    接受编码:gzip,DEFLATE
    接受语言:en-US、en;q=0.9、ar;q=0.8
    MODE=1、CMD=18、0
    、[32]、[82,83,848,86,87,88,89,91,91,91,92,93,96,97,99]、[102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,117,118,b2]</s>106,107,108,109 110,111,112,113114,115,116,117117,118

    这是端口8080到端口1的

    Post /Web_u8WebServerCGI HTTP/1.1主机: 10.1.0.204:8080
    连接:保持活动
    内容长度:16
    授权:基本 YWRtaW46YWRtaW4=
    用户代理:Mozilla/5.0 (Windows NT 10.0;Win64;x64) AppleWebKit/537.36 (KHTML、如 Gecko) Chrome/113.0.0.0 Safari / 537.36
    Content-Type:text/plain;charset=UTF-8
    接受:*/*
    来源:http://10.1.0.204:8080
    推荐人:http://10.1.0.204:8080/
    接受编码:gzip,DEFLATE
    接受语言:en-US、en;q=0.9、ar;q=0.8
    MODE=1、CMD=18、0、[32]、[82,83,848,86,87,88,89,91,91,91,92,93,96,97,99]、[102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,117,118,b2]</s>106,107,108,109 110,111,112,113114,115,116,117117,118


    它们是相同的、在 TCP 请求级别上、我认为它们会有所不同、因为有许多 TCP 数据包被发送以终止连接、我先前在带有[RST]标记的备注中复制了该连接

    此外,我尝试了其他网络,直接连接 MCU 的以太网到 PC,并使用 我的家庭路由器也使用 Wireshark 与这样的过滤器 ip.src== 10.1.0.204 || ip.dst=10.1.0.204

    使用此 IP 10.0.204查找进出 MCU 的请求  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!  

     我仍然不确定问题是什么。 然而,我只是做了一个超越比较的差异之间的两个红色和两个蓝色。 这两个蓝色是相同的。 但这两个红色之间有着微妙的差异。 请参见下方的。 如果您查看8080端口的第一行、则 POST 命令和 Host 将它们连接到同一行中。  我建议您将其分成两行、就像您对端口80所做的那样、看看这是否会产生影响。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    它们即使是两个红色也是相同的、除了端口号、但对于我之前发送的日志、对于 HTTP 请求、与端口80不同的端口存在时序问题。行为是 MCU 继续发送数据包 (蓝色文本的响应)即使客户端也会发送带有标记[RST]的 TCP 数据包、该标记终止连接、而 MCU 不会侦听该命令并继续发送数据  

    -第一件事是,我不知道为什么客户端触发命令[RST]与端口8080之前所有数据包被发送,而不与端口80即使所有设置我的 PC 允许连接端口8080 (我添加了一个规则,允许通过 Windows 防火墙设置传入和传出连接在此端口上进行连接)

    这就是为什么我在端口80和8080上看到相同的请求和响应,但应用层(我的客户端(发送请求的 chrome 控制台,js 代码))检测到[RST]的命令,该命令在端口8080接收 TCP 数据包级别的所有数据之前终止连接  

    这会触发请求本身损坏、并  在 Chrome 控制台上触发错误网:ERR_INVALID_HTTP_RESPONSE

    对于端口80、在所有 TCP 数据包都发送完毕后、就会发送该 TCP 数据包[RST]、并正确终止连接、这将对端口80正常工作

    第二、为什么 MCU 在接收到这个[RST]数据包时不会终止连接、即使客户端请求终止、也会继续发送数据。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    甚至客户端发送带有标记[RST]的 TCP 数据包,该标记终止连接,而 MCU 不侦听该命令并继续发送数据[/ 报价]

     我不知道为什么客户端发送 RST 而不是 FIN 来终止连接。 RST 更像是立即中止、而不是像 FIN 中那样正常地连接。 本文将帮助您了解 RST 和 FIN 之间的基本知识。  

    https://www.baeldung.com/cs/tcp-fin-vs-rst#:~:text=An%20RST%20message%20aborts%20a%20TCP%20connection.&text=In%20practice%2C%20an%20RST%20message,from%20the%20other%20entity%20communicating

    第二个问题是为什么 MCU 在收到此[RST]数据包时不会终止连接,并且即使客户端请求终止,仍会继续发送数据。

    下面是另一个讨论、讨论如何使用 SO_LINGER、超时为0、可立即关闭连接。  尝试使用 SO_LINGER、看看这是否有所不同。  

    https://stackoverflow.com/questions/3757289/when-is-tcp-option-so-linger-0-required

    [/quote]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我认为这篇文章也有助于发送 RST 的原因。  

    https://iponwire.com/tcp-reset-rst-reasons/

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    最后,问题解决了!!!

    非常感谢 Charles 的帮助,您之前发送的链接实际上很随和,并帮助我了解如何在 TCP 级别上建立连接  

    问题在于应用层被配置为了解并解析 HTTP (80)、HTTPS (443)和其他默认协议的默认端口。 这意味着即使在指示协议版本或内容类型的数据上没有标记、它也能理解发送的数据。 但是、当我将端口更改为自定义 HTTP 端口(8080)时、不会发生这种默认行为、因为应用层不知道使用的是哪种协议。 为了让客户端的应用层了解数据、我需要添加此信息。 我通过在发送任何数据之前添加两条线来解决问题。 这使我能够为端口80以外的任何自定义端口提供服务。 同样的方法可用于任何不同的协议、如 HTTPS。

    httpSendStatusLine(objstrWebSocketInfo.objSocket, HTTP_OK, CONTENT_TYPE_HTML);
    httpSendClientStr(objstrWebSocketInfo.objSocket, CRLF);
    
    //then send whatever you want :D


    对于我们之前讨论过的同一个请求、

    Post /Web_u8WebServerCGI.cgi HTTP/1.1
    主机:10.1.0.204:8094
    连接:保持活动
    内容长度:16
    授权:基本 YWRtaW46YWRtaW4=
    用户代理:Mozilla/5.0 (Windows NT 10.0;Win64;x64) AppleWebKit/537.36 (KHTML、如 Gecko) Chrome/113.0.0.0 Safari / 537.36
    Content-Type:text/plain;charset=UTF-8
    接受:*/*
    来源:http://10.1.0.204:8094
    推荐人:http://10.1.0.204:8094/
    接受编码:gzip,DEFLATE
    接受语言:en-US、en;q=0.9、ar;q=0.8
    MOD=1、CMD=18、0、
    HTTP/2.0 200正常
    内容类型:text/html
    [[32]、[83,84,8,86,87,88,89,90,91,92,93,94,95,96,97,99]、[102,103,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119]、107,108,109,110、[39,"F"111,112,113,114[39,"F"]115,116,117,118]

    其中红色是从客户端发送到服务器的请求、蓝色是  从服务器发送到客户端的响应