请参阅对“的Fin Ack响应”;HTTP/1.0 200 OK“;小包裹 我试图让我的程序(使用NavaCabo C++ +Builder和Indy协议栈编写)连接到一个专有服务器。我应该发送一个HTTP命令“GET/hyd/1.s16”,此时服务器应该向我发送一组数据。出于某种原因,我的协议栈发送Fin Ack以响应“HTTP/1.0 200 OK数据包”

请参阅对“的Fin Ack响应”;HTTP/1.0 200 OK“;小包裹 我试图让我的程序(使用NavaCabo C++ +Builder和Indy协议栈编写)连接到一个专有服务器。我应该发送一个HTTP命令“GET/hyd/1.s16”,此时服务器应该向我发送一组数据。出于某种原因,我的协议栈发送Fin Ack以响应“HTTP/1.0 200 OK数据包”,http,tcp,Http,Tcp,当我使用服务器模拟器运行时,一切正常: 客户端发送Syn 服务器发送Syn Ack 客户端发送Ack 客户端使用Get命令发送Psh、Ack 服务器发送Ack 服务器发送带有“HTTP/1.0 200 OK数据包”的Psh、Ack 服务器在重新组装的PDU中发送数据 客户端发送Ack 服务器在重新组装的PDU中发送数据 服务器在重新组装的PDU中发送数据 客户端发送Ack 当客户与实际服务器一起运行时,我使用的协议栈不喜欢服务器发送的“HTTP/1.0 200 OK数据包”,并发送“Fin

当我使用服务器模拟器运行时,一切正常:

  • 客户端发送Syn
  • 服务器发送Syn Ack
  • 客户端发送Ack
  • 客户端使用Get命令发送Psh、Ack
  • 服务器发送Ack
  • 服务器发送带有“HTTP/1.0 200 OK数据包”的Psh、Ack
  • 服务器在重新组装的PDU中发送数据
  • 客户端发送Ack
  • 服务器在重新组装的PDU中发送数据
  • 服务器在重新组装的PDU中发送数据
  • 客户端发送Ack
  • 当客户与实际服务器一起运行时,我使用的协议栈不喜欢服务器发送的“HTTP/1.0 200 OK数据包”,并发送“Fin Ack”响应-数据包7

  • 客户端发送Syn
  • 服务器发送Syn Ack
  • 客户端发送Ack
  • 客户端使用Get命令发送Psh、Ack
  • 服务器发送Ack
  • 服务器发送带有“HTTP/1.0 200 OK数据包”的Psh、Ack
  • 客户端发送Fin,确认****错误****
  • TIdTCPClient*TCPClient;
    TCPClient->Port=M3R\u端口;
    TCPClient->Host=IntToStr((int)ipAddPt1)+”+
    IntToStr((int)ipAddPt2)+”+
    IntToStr((int)ipAddPt3)+”+
    IntToStr((int)ipAddPt4);
    TCPClient->Connect();
    TCPClient->IOHandler->Write(m3rData);/“GET/hyd/1.s16 HTTP/1.0\x0d\x0a\x0d\x0a”);
    而(!完成){
    readLine[x]=TCPClient->IOHandler->ReadLn();//扩展头=ChannelId
    
    if(readLine[x].Length()此处未拒绝任何内容。您和服务器正在使用HTTP 1.0,但未使用
    keepalive
    选项。这意味着每个连接只有一个请求/响应。您的客户端在收到响应后关闭连接是完全正确的。

    但是您的代码在哪里?您的BadTrace pcap表明您正在关闭连接n之前,你应该这样做,但至于为什么,我们不能真正调试它,而不看你的程序做什么。调试客户机代码——找出错误发生时它在做什么。我添加了代码。在我看来,协议栈拒绝的是Psh Ack,而不是我的应用程序代码,因为Fin Ack是在服务器的p之后0.18毫秒发送的acket。我不知道我们应该如何处理加密会话的Wireshark转储。这是有意义的,但它没有解释为什么它与模拟器而不是真实设备一起工作。我实际上没有建立HTTP连接,但也许我应该使用keep alive。如果我没记错的话,编写该设备的人说他在TCP上使用了HTTP命令,但没有建立HTTP连接。他将在太平洋中部的一艘轮船上呆上几周,所以我必须等他回来做任何测试。谢谢你的想法。
    TIdTCPClient *TCPClient;
    
    TCPClient->Port = M3R_PORT;
    TCPClient->Host =   IntToStr((int) ipAddPt1) + "." +
                                    IntToStr((int) ipAddPt2) + "." +
                                    IntToStr((int) ipAddPt3) + "." +
                                    IntToStr((int) ipAddPt4);
    TCPClient->Connect();
    TCPClient->IOHandler->Write(m3rData);//"GET /hyd/1.s16 HTTP/1.0\x0d\x0a\x0d\x0a");
    
    while (!done) {
        readLine[x] = TCPClient->IOHandler->ReadLn();   // extension-header = ChannelId
        if (readLine[x].Length() <= 0) {
            done = true;
        }
    }