我试图让我的程序(使用Embarcadero C++ builder和Indy协议栈编写)连接到专有服务器。我应该发送一个HTTP命令“GET /hyd/1.s16”,此时服务器应该向我发送一堆数据。 “HTTP/1.0 200 OK包”出于某种原因,我的协议栈响应发送一个FIN确认传送至请参阅Fin Ack对“HTTP/1.0 200 OK”数据包的响应
当我与一个服务器模拟器一切运行正常工作:
- 客户端发送Syn的
- 服务器发送SYN ACK
- 客户端发送确认
- 客户端发送PSH,确认与获取命令
- 服务器发送确认
- 即成R发出PSH,确认与 “HTTP/1.0 200 OK分组”
- 服务器在重新组装PDU
- 客户端发送的数据发送的Ack
- Server发送数据在重新组装PDU
- 服务器在重新组装PDU发送数据
- 客户端发送确认 ...
Link to good Wireshark capture
当客户る纳秒与实际的服务器,我使用的协议栈不喜欢“HTTP/1.0 200 OK分组”服务器发送,并发送一个“鳍确认”响应 - 数据包7.
- 客户端发送的Syn
- 服务器发送SYN ACK
- 客户端发送的Ack
- 客户端发送PSH,确认与获取命令
- Server发送的Ack
- 服务器发送PSH,确认与 “HTTP/1.0 200 OK分组”
- 客户端发送翅,确认**** ****错误
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;
}
}
但你的代码在哪里?您的BadTrace pcap建议您在应用之前关闭连接,但至于为什么,如果没有看到程序的功能,我们无法真正进行调试。 – nos
调试客户端代码 - 找出发生错误时的操作。 –
我添加了代码。在我看来,协议栈拒绝Psh Ack而不是我的应用程序代码,因为Fin Ack在服务器数据包后0.18毫秒内发送。 – Curtis