我試圖讓我的程序(使用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