Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi socks5 verbindung testen (https://www.delphipraxis.net/143135-socks5-verbindung-testen.html)

BBoy 10. Nov 2009 13:13


socks5 verbindung testen
 
Ich habe 3 gute Proxys die leider nicht immer online sind. Daher würde ich mir gerne ein Tool PRogrammieren dass z.B. alle 10 minuten testet ob einer der Proxys verfügbar ist. Ein Socks5 Proxy ist mit Authentifizierung die anderen ohne. Wobei einer glaube ich auch nur Socks4 ist.

Weis jemand wie ich das Programmieren könnte in Delphi 2007 ?
Danke.
mfg

uoeb7gp 10. Nov 2009 20:45

Re: socks5 verbindung testen
 
Versuchs mit folgendem Code.

[delphi]

uses
.., winsock;


function CanListen(Port: DWORD): Boolean;
var
Name : TSockAddr;
nRet : Integer;
Socket : TSocket;
WSData : TWSAData;
begin
result := False;
WSAStartup($0101, WSData);
try
Socket := WinSock.Socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
try
if Socket<>INVALID_SOCKET then begin
ZeroMemory(@Name,SizeOf(TSockAddr));
with Name do begin
sin_Family := PF_INET;
sin_Port := htons(Port);
sin_Addr := TInAddr(htonl(INADDR_ANY));
end;
nRet := Bind(Socket, Name, SizeOf(Name));
if (nRet <> SOCKET_ERROR) then
result := (WinSock.Listen(Socket,SOMAXCONN) <> SOCKET_ERROR);
end;
finally
if Socket <> INVALID_SOCKET then
CloseSocket(Socket);
end;
finally
WSACleanup;
end;
end;

uoeb7gp 10. Nov 2009 21:00

Re: socks5 verbindung testen
 
[delphi][center]

für remoteServer folgender Code

function _CheckCon(const IP:string):boolean;
var
ClientSocket : TSocket;
Name : TSockAddr;
WSData : TWSAData;
begin
result:=false;
WSAStartup($0101,WSData); // WinSock v1.1
ClientSocket := WinSock.Socket(PF_INET,sock_Stream,IPPROTO_IP);
if (ClientSocket <> Invalid_Socket) then begin
with Name do begin
sin_Family := PF_INET;
sin_Port := htons(139); // die Portnummer des Servers
sin_Addr := TInAddr(Inet_Addr(PChar(IP))); // inet_addr in in_addr umwandeln
end;
result:=(Connect(ClientSocket,Name,SizeOf(Name))<> Socket_Error); // connection zum Server aufbauen
end;
CloseSocket(ClientSocket);
WSACleanup;
end;

BBoy 11. Nov 2009 18:46

Re: socks5 verbindung testen
 
hmmm, wo gebe ich da die ip des socks5 an? und den username und passwort?

xxl1 11. Nov 2009 18:56

Re: socks5 verbindung testen
 
Delphi-Quellcode:
with Name do begin
sin_Family := PF_INET;
sin_Port := htons(139); // die Portnummer des Servers (hier des Socks5 Servers)
sin_Addr := TInAddr(Inet_Addr(PChar(IP))); // IP Adresse des Socks5 Servers für ip einsetzen z.b '192.168.1.155'
den benutzernamen und das passwort kann man hier noch nirgends eingeben weil du dafür ein protokoll bräuchtest, was du dir entweder selber schreiben musst oder dir ne gute quelle suchen musst ;-)

Mit dem von den zwei anderen geposteten Code überprüfst du nur ob der Server auf der IP-Adresse in kombination mit dem Port lauscht... was ja reichen könnte
-> Verbindung kann hergestellt werden -> Proxy online
-> Verbindungstimeout -> Proxy offline

BBoy 11. Nov 2009 19:19

Re: socks5 verbindung testen
 
ich habe den code jetzt so:
Delphi-Quellcode:
function CanListen(Port: DWORD): Boolean;
var
Name : TSockAddr;
nRet : Integer;
Socket : TSocket;
WSData : TWSAData;
begin
result := False;
WSAStartup($0101, WSData);
try
Socket := WinSock.Socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
try
if Socket<>INVALID_SOCKET then begin
ZeroMemory(@Name,SizeOf(TSockAddr));
with Name do begin
sin_Family := PF_INET;
sin_Port := htons(3541); // die Portnummer des Servers (hier des Socks5 Servers)
sin_Addr := TInAddr(Inet_Addr(PChar('98.206.10.111'))); // IP Adresse des Socks5 Servers für ip einsetzen z.b '192.168.1.155'
end;
nRet := Bind(Socket, Name, SizeOf(Name));
if (nRet <> SOCKET_ERROR) then
result := (WinSock.Listen(Socket,SOMAXCONN) <> SOCKET_ERROR);
end;
finally
if Socket <> INVALID_SOCKET then
CloseSocket(Socket);
end;
finally
WSACleanup;
end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
 if canlisten(3541) = true then
 showmessage('online');
end;
aber die showmessage zeigt er nicht an, also wäre der proxy nicht online, ist er aber. ihr könnte das ja testen, die ip ist eingetragen,

BBoy 11. Nov 2009 21:43

Re: socks5 verbindung testen
 
ich habe auch die indy und die overbyte ics componenten. Geht es damit besser?

mit ics habe ich folgendes gemacht:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
    WSocket1.Proto     := 'tcp';
    WSocket1.Port      := '80';
    WSocket1.addr      := 'google.de';
    WSocket1.socksPort := '3541';
    WSocket1.socksserver:= '98.206.11.111';
    WSocket1.Connect;

end;

procedure TForm1.WSocket1Error(Sender: TObject);
begin
showmessage('fehler');
end;

procedure TForm1.WSocket1SessionConnected(Sender: TObject; ErrCode: Word);
begin
    Memo1.Lines.Add('Session connected to remote host.');

end;

procedure TForm1.WSocket1SocksConnected(Sender: TObject; ErrCode: Word);
begin
   Memo1.Lines.Add('Session connected to socks server.');
end;

procedure TForm1.WSocket1SocksError(Sender: TObject; Error: Integer;
  Msg: string);
begin
    Memo1.Lines.Add('Socks error #' + IntToStr(Error) + ' ' + Msg);
end;

end.
problem ist, dass auch dann wenn der socks ungültig ist (egal welche ip/port ich eingebe) immer erscheint das es durch den socks zum host connected hat, ansonsten wäre es genaus das was ich suche.

xxl1 12. Nov 2009 15:44

Re: socks5 verbindung testen
 
Delphi-Quellcode:
var
Name : TSockAddr;
nRet : Integer;
Socket : TSocket;
WSData : TWSAData;
begin
result := False;
WSAStartup($0101, WSData);
try
Socket := WinSock.Socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
try
if Socket<>INVALID_SOCKET then begin
ZeroMemory(@Name,SizeOf(TSockAddr));
with Name do begin
sin_Family := PF_INET;
sin_Port := htons(3541); // die Portnummer des Servers (hier des Socks5 Servers)
sin_Addr := TInAddr(Inet_Addr(PChar('98.206.10.111'))); // IP Adresse des Socks5 Servers für ip einsetzen z.b '192.168.1.155'
end;
{nRet := Bind(Socket, Name, SizeOf(Name));
if (nRet <> SOCKET_ERROR) then
result := (WinSock.Listen(Socket,SOMAXCONN) <> SOCKET_ERROR);
end;    }      //  Bind+ Listen brauchst du nur wenn du deinen Socket an einen
                //  bestimmten Port binden willst und drauf lauschen! Ein
                //  Serverprogramm also, das du hier wohl nicht willst
                //  stattdessen wohl solltest du mit Connect arbeiten wie oben!
deine_variable:=(Connect(Socket,Name,SizeOf(Name))<>Socket_Error); // connection zum Server aufbauen
Edit: Guck dir vllt auch mal connect im MSDN an!
es sollte eigentlich zu unterscheiden sein ob du einen verbindung herstellen kansnt oder nicht ;-)

BBoy 13. Nov 2009 11:33

Re: socks5 verbindung testen
 
ok, so funktioniert es jetzt gut. Danke.
Kann ich noch irgendwie die Timeout zeit einstellen, also wie lange auf antwort gewartet werden soll?


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz