2012-05-09 6 views
7

Tôi nên khôi phục trong tình huống này như thế nào?khôi phục từ "Thiết lập kết nối theo ngang hàng" Indy TCP Client

Máy chủ bị treo, do đó kết nối đã bị đóng bất thường. Các cuộc gọi đến hầu hết mọi thứ dẫn đến các ngoại lệ "Kết nối đặt lại theo ngang hàng". Tôi dường như đã cố định nó bằng cách gọi Disconnect trên đối tượng TIdTCPClient bên trong khối ngoại trừ, nhưng nó kết quả trong một ngoại lệ cuối cùng với cùng một thông báo (mà tôi đã bắt gặp trong khối try-except thứ hai).

Đây là với Indy10 và Delphi XE2.

try 
     if not EcomSocket.Connected then EcomSocket.Connect(); 
    except 
     on e: Exception do begin 
     try 
      EcomSocket.Disconnect(); 
     except 
      MessageDlg('Connectivity to the server has been lost.', mtError, [mbOK], 0); 
     end; 
     end; 
    end; 
+0

Bạn đã thử để gỡ lỗi vào TIdTCPConnection.Disconnect trong IdTCPConnection.pas? Có thể một trình xử lý OnDisconnect được thực hiện và sử dụng kết nối. Hoặc NotifyPeer đóng một vai trò, cũng xem các ý kiến ​​trong nguồn về các kịch bản khác nhau – mjn

+0

Giải phóng đối tượng và tạo một đối tượng mới sẽ giúp (nhưng không giúp tìm lý do ngoại lệ) – mjn

+0

Tôi không quan tâm nhiều đến lý do Tôi nhận được một ngoại lệ khi gọi ngắt kết nối. Tôi chỉ muốn biết làm thế nào để phục hồi đúng cách từ một tình huống như thế này. –

Trả lời

7

Hãy thử điều này:

try 
    if not EcomSocket.Connected then EcomSocket.Connect(); 
except 
    try 
    EcomSocket.Disconnect(False); 
    except 
    end; 
    if EcomSocket.IOHandler <> nil then EcomSocket.IOHandler.InputBuffer.Clear; 
    MessageDlg('Connectivity to the server has been lost.', mtError, [mbOK], 0); 
end; 
+1

Chuyển "false" sang phương thức Disconnect đã sửa nó. Hành vi mặc định của nó là gọi DisconnectNotifyPeer, nó đã kích hoạt ngoại lệ thứ hai. –