2015-11-24 40 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

相關問題