2015-11-24 39 views
-1

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

当我与一个服务器模拟器一切运行正常工作:

  1. 客户端发送Syn的
  2. 服务器发送SYN ACK
  3. 客户端发送确认
  4. 客户端发送PSH,确认与获取命令
  5. 服务器发送确认
  6. 即成R发出PSH,确认与 “HTTP/1.0 200 OK分组”
  7. 服务器在重新组装PDU
  8. 客户端发送的数据发送的Ack
  9. Server发送数据在重新组装PDU
  10. 服务器在重新组装PDU发送数据
  11. 客户端发送确认 ...

Link to good Wireshark capture

当客户る纳秒与实际的服务器,我使用的协议栈不喜欢“HTTP/1.0 200 OK分组”服务器发送,并发送一个“鳍确认”响应 - 数据包7.

  1. 客户端发送的Syn
  2. 服务器发送SYN ACK
  3. 客户端发送的Ack
  4. 客户端发送PSH,确认与获取命令
  5. Server发送的Ack
  6. 服务器发送PSH,确认与 “HTTP/1.0 200 OK分组”
  7. 客户端发送翅,确认**** ****错误

Link to bad Wireshark capture

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; 
    } 
} 
+3

但你的代码在哪里?您的BadTrace pcap建议您在应用之前关闭连接,但至于为什么,如果没有看到程序的功能,我们无法真正进行调试。 – nos

+0

调试客户端代码 - 找出发生错误时的操作。 –

+0

我添加了代码。在我看来,协议栈拒绝Psh Ack而不是我的应用程序代码,因为Fin Ack在服务器数据包后0.18毫秒内发送。 – Curtis

回答

0

没有正在这里拒绝。你和服务器都在讲HTTP 1.0,没有keepalive选项。这意味着每个连接都有一个请求/响应。您的客户在收到回应后完全正确地关闭连接。

+0

这是有道理的,但它不能解释为什么它可以与模拟器一起使用,而不是真正的设备。我实际上并没有建立一个HTTP连接,但也许我应该然后使用保持活着。如果我没有记错,编写设备的人说他使用了TCP上的HTTP命令,但没有建立HTTP连接。他将在太平洋中间的一艘船上工作几周,所以我将不得不等待他回来做任何测试。感谢这个想法。 – Curtis

相关问题