2014-01-16 2 views
0

indy에서 특별히 클라이언트/서버를 코딩하는 데있어서 새로운 점이 있습니다. 여기에서 내 TCPClient와 관련이있는 것은 무엇입니까? 주 서버 IP가 오프라인이면 다른 IP에 연결하려고 시도합니다. 그걸 어떻게 할 생각이야? 나는 단지 그것이 같을 것이라고 짐작하고있다. ...TCPClient가 ip 목록에 연결 중

IdTCPClient1.ReuseSocket := rsTrue; 
    IdTCPClient1.BoundIP := '192.168.1.31'; //other ip here 
    IdTCPClient1.BoundPort := 5000; 
    IdTCPClient1.Host := 'localhost';//main ip server here 
    IdTCPClient1.Port := 5000; 

    IdTCPClient1.Connect; 

나는 메신저를 얻고있다. "Count not bind socket." 또는 "주소가 이미 사용 중입니다."

+0

일반적인 조언, 당신이 급류처럼 정말 거대하고 빈번한 데이터 교환을하지 않은 경우 : 수십 GB를 수백만 개의 짧은 격리 패킷으로 분할하면 HTTP + JSON을 사용하는 것이 좋습니다. 그것은 텍스트이고 표준 = 당신의 눈을 포함하여 모든 문제를 디버깅하기위한 툴이 많이 있습니다. "작동하지 않음"에서 "하지 말 것"의 어떤 이유로 든 선택할 수있는 델파이 용 방화벽과 6 개의 라이브러리에는 문제가 없습니다 " –

+0

처럼 나는 BoundPort 만 남기고 ('0') OS가 무료 포트 번호를 선택하게 할 것입니다. –

답변

1

BoundIP에 대해 http://www.delphigroups.info/2/7/199566.html을 읽으십시오.

TCPClient를 ips의 스크롤 목록으로 만들 수 없습니다. 만약 당신이 할 수만 있다면 10 개 또는 100 개의 주소를 넣을 수있는 배열과 같은 속성이있을 것입니다.

당신이 정말로 무엇을해야 - 실제로 다른 주소로 연결을 시도한다

예 :

function TryToConnect(const server: string): boolean; overload; 
begin 
    try 
    IdTCPClient1.ReuseSocket := rsTrue; 
    IdTCPClient1.Host := server; 
    IdTCPClient1.Port := 5000; 

    IdTCPClient1.Connect; 
    Result := true; 
    except on E: Exception do begin 
    Result := false; 
    LogToFileAndScreenAnError(E.ClassName + ' ==> ' + E.Message); 
    end; 
end; 

function TryToConnect(const servers: array of string): boolean; overload; 
var i: integer; 
begin 
    Result := false; 
    for i := Low(servers) to High(Servers) do begin 
     Result := TryToConnect(servers[i]); 
     if Result then break; 
    end; 


    if not Result then LogAndShowError('Could not connect to any of servers! Read log file!'); 

{ or maybe even 

    if not Result then raise Exception.Create('Could not connect to any of servers! Read log file!'); 

} 
end; 


var ss: TStringDynArray; 

SetLength(SS, 2); 
ss[0] := 'localhost'; 
ss[1] := '192.168.3.10'; 

Success := TryToConnect(ss);