Forcer le port d'un client (TClientSocket) ??? [Delphi] - Programmation
Marsh Posté le 19-11-2001 à 17:08:23
up
C important....
Personne à une réponse ?
Marsh Posté le 22-11-2001 à 14:17:21
Marsh Posté le 22-11-2001 à 16:40:41
Tu veux dire le Bound Port? C'est ca?
Si oui tu es mal parti... Tu sais pas le faire avec le TClientSocket, la tu sais voir le LocalPort mais tu sais pas le forcer...
Utilise les compos Indy (gratos et inclu depuis d5) et la y aussi un TTcpClient (TIdTcp ou je ne sais quoi) sur lequel tu sais specifier le port préféré... Je ne connais pas sa réaction si le port est déja utilisé, ca a toi de voir...
Au fait, remercie Antp, c'est grace a lui que je te reponds, il m'a supplié de le faire, je sais pas pourquoi :-D
Marsh Posté le 22-11-2001 à 16:41:45
buitoni a écrit a écrit : Au fait, remercie Antp, c'est grace a lui que je te reponds, il m'a supplié de le faire, je sais pas pourquoi :-D |
ça me faisait mal au coeur de le voir faire des up dans ce topic où personne répond
et d'abord j'ai pas supplié... je t'ai juste dit d'aller voir et de répondre si tu savais...
[edtdd]--Message édité par antp--[/edtdd]
Marsh Posté le 22-11-2001 à 16:45:04
Ouai enfin soit, j'avais deja lu et c'etait pas clair, mais bon, tu m'as forcé, j'ai relu et j'ai compris ce qu'il voulait...
En plus il a du bol, j'avais justement delphi lancé :-p
Marsh Posté le 22-11-2001 à 16:45:48
Merci !!!!!!!!!!!!!!!!!
Je vais essayer ça ce soir......
Mais y a un ptit hic..... C que le début du soft est basé sur TClientSocket/TServerSocket......
Je vais étudier la question...
Merci de ton aide
(Merci Antp aussi )
Marsh Posté le 22-11-2001 à 16:47:25
buitoni a écrit a écrit : Ouai enfin soit, j'avais deja lu et c'etait pas clair, mais bon, tu m'as forcé, j'ai relu et j'ai compris ce qu'il voulait... En plus il a du bol, j'avais justement delphi lancé :-p |
Arf ok je vais + expliciter mais C pas évident à expliquer....
(Merci )
Marsh Posté le 22-11-2001 à 16:58:31
[SDF]Poire a écrit a écrit : Merci !!!!!!!!!!!!!!!!! Je vais essayer ça ce soir...... Mais y a un ptit hic..... C que le début du soft est basé sur TClientSocket/TServerSocket...... Je vais étudier la question... Merci de ton aide (Merci Antp aussi ) |
C'est pas vraiment compliquer à changer, vu que tu t'es basé sur un truc bas niveau, tu as qqs appels à changer (le nom quoi) a part ca tout est la... Avec la propriété que tu veux en plus :-)
http://www.nevrona.com/indy si tu veux la derniere version d'Indy (je te le conseille)
Marsh Posté le 22-11-2001 à 20:38:48
buitoni a écrit a écrit : C'est pas vraiment compliquer à changer, vu que tu t'es basé sur un truc bas niveau, tu as qqs appels à changer (le nom quoi) a part ca tout est la... Avec la propriété que tu veux en plus :-) http://www.nevrona.com/indy si tu veux la derniere version d'Indy (je te le conseille) |
Arf..... moi qui voulait rester en bas niveau.....
En + je suis complétement paumé dans C composants Indy....
Alors soit C moi qui suis complétement con soit ça va pas être si facile que ça à changer.....
Je vais jeter un coup d'oeuil dans les sources pour voir comment ils font....
[edtdd]--Message édité par [SDF]Poire--[/edtdd]
Marsh Posté le 22-11-2001 à 20:49:51
Ca change pas tant que ca par rapport au TClientSocket hein
Marsh Posté le 22-11-2001 à 21:01:26
buitoni a écrit a écrit : Ca change pas tant que ca par rapport au TClientSocket hein |
Si (mais C où OnRead, OnWrite.....)!!!
Mais je vais me démerder avec les sources...
Ca me donne une base de recherche....
Marsh Posté le 22-11-2001 à 21:15:35
Conclusion apres un ptit tout dans les sources de Indy :
TClientSocket C pas assez bas niveau... les gars de chez Borlands n'ont pas daignés prendre 10s pour rajouter une chtite propriété
C dans la connection que le socket précise le bound port (IOHandler.ConnectClient(Host, Port, BoundIP, BoundPort, BoundPortMin, BoundPortMax, ATimeout);) et vue que avec TClientSocket je me connecte avec Open qui prend pas de parametres.....
(Je sens venir la création d'un nouveau composant.... qui heritera fortement de TClientSocket....)
petite modif : IOHandler.ConnectClient(...) est tjs une methode appartenant à Indy...(Suis en train de chercher ce qu'elle utilise....)
[edtdd]--Message édité par [SDF]Poire--[/edtdd]
Marsh Posté le 22-11-2001 à 21:54:27
C'est le bordel les sources d'indy hein?
J'ai essayé de lire un peu leur truc a cause d'une merde pour leur compo TIdHttp, après une heure j'ai pris une aspirine, un supo et au dodo
Sinon y en pleins d'autres tu sais des compos TTcpClient, va voir ICS de Fpiette par exemple, il est chouette aussi.
Y a aussi un compo TTcpClient des premieres heures de Delphi, si tu veux je peux essayer de le retrouver...
Marsh Posté le 22-11-2001 à 21:57:38
buitoni a écrit a écrit : C'est le bordel les sources d'indy hein? J'ai essayé de lire un peu leur truc a cause d'une merde pour leur compo TIdHttp, après une heure j'ai pris une aspirine, un supo et au dodo Sinon y en pleins d'autres tu sais des compos TTcpClient, va voir ICS de Fpiette par exemple, il est chouette aussi. Y a aussi un compo TTcpClient des premieres heures de Delphi, si tu veux je peux essayer de le retrouver... |
Tien une aspirine C pas une mauvaise ID.....
Ca avance mais pas vite.... C vrai que C le bordel et qu'ils ont bien tout caché
Mais au moins y a les sources ce qui est déjà pas mal
Marsh Posté le 22-11-2001 à 22:04:21
http://overbyte.alexid.fr/frame_index.html
Va voir ca, les sources y sont aussi et le mec est Belge (comme moi ;p)
Marsh Posté le 22-11-2001 à 22:07:37
buitoni a écrit a écrit : http://overbyte.alexid.fr/frame_index.html Va voir ca, les sources y sont aussi et le mec est Belge (comme moi ;p) |
J'y go
Arf les gars de Indy ils sont encore + tordus que moi ils ont découpé ça en 3 millions de fichiers alors pour s'y retrouver ....
Marsh Posté le 22-11-2001 à 22:20:19
Bon G installé mais les sources je verrai demain.... les Indy m'ont tué....
Aprés l'aspirine je vais au dodo (excuse je saute le supo mais bon..... )
Marsh Posté le 22-11-2001 à 22:20:55
[SDF]Poire a écrit a écrit : Bon G installé mais les sources je verrai demain.... les Indy m'ont tué.... Aprés l'aspirine je vais au dodo (excuse je saute le supo mais bon..... ) |
Raaah, le supo, le supo!
Marsh Posté le 22-11-2001 à 22:24:18
buitoni a écrit a écrit : Raaah, le supo, le supo! |
Non
Merci de ton soutient
Marsh Posté le 24-11-2001 à 01:02:00
buitoni a écrit a écrit : http://overbyte.alexid.fr/frame_index.html Va voir ca, les sources y sont aussi et le mec est Belge (comme moi ;p) |
Bon G regardé un peu la source du composant (en particulier WSocket)....
C beaucoup mieux que les sources des Indy
J'appronfondi ça demain
Marsh Posté le 24-11-2001 à 01:59:08
[SDF]Poire a écrit a écrit : Bon G regardé un peu la source du composant (en particulier WSocket).... C beaucoup mieux que les sources des Indy J'appronfondi ça demain |
Ouai Indy ils font peur... ils respectent deja pas les guidelines de Borland alors que le projet est quand meme sous leurs ailes...
Marsh Posté le 24-11-2001 à 15:19:00
Bon j'y suis presque.....
Y a un truc avec TSockAddrIn et TCustomWinSocket.InitSocket
Mais j'arrive pas à conclure.....
Marsh Posté le 25-11-2001 à 21:53:27
Arf je commence à désespérer.... (C pas ptet que je m'y prend mal....)
Tout ce que G réussi à trouver C un mal de crâne....
Si qq a une bonne aide socketwindows (en fr si possible....) je suis preneur...
[edtdd]--Message édité par [SDF]Poire--[/edtdd]
Marsh Posté le 28-11-2001 à 20:44:28
C bon G trouvé !!!!!!!!!!!!!!!!!!!!!
Merci à
Buitoni
Antp
François Piette
FOBEC
Catherine Verdier
Merci
Le code arrive bientôt....
Lundi déjà j'aurai pu trouver.... (tout ça à cause d'un oubli de stdcall)
Merci encore à tous
Marsh Posté le 28-11-2001 à 21:00:18
Voilà le code :
unit Client1;
interface
uses
Windows,....., Winsock;
const
winsocket = 'wsock32.dll';
type
Thtons = function (hostshort: u_short): u_short; stdcall;
TInet_addr = function (cp: PChar): u_long; stdcall;
TBind = function (s: TSocket; var addr: TSockAddr; namelen: Integer): Integer; stdcall;
.
.
.
var
Form1: TForm1;
Pseudo : String;
FDllHandle: THandle;
FBind: TBind;
Fhtons: Thtons;
FInet_addr: TInet_addr;
function WSocket_htons(hostshort: u_short): u_short;
function WSocketResolveHost(InAddr : String) : TInAddr;
procedure GetHostInfo(var Name, Address: string);
implementation
.
.
.
procedure TForm1.ButtonSeConnecterClick(Sender: TObject);
begin
ClientSocket1.Port:= 600;
ClientSocket1.Host:= '180.12.5.21';
ClientSocket1.Open;
end;
procedure TForm1.ClientSocket1Connecting(Sender: TObject;
Socket: TCustomWinSocket);
var
SockNamelen: Integer;
LocalSockName: TSockAddrIn;
Ip, n: String;
begin
GetHostInfo(n, Ip);
FillChar(LocalSockName, Sizeof(LocalSockName), 0);
SockNamelen := sizeof(LocalSockName);
LocalSockName.sin_family := AF_INET;
LocalSockName.sin_port := WSocket_htons(666);//Port Local
LocalSockName.sin_addr.s_addr := WSocketResolveHost(Ip).s_addr;
FBind(ClientSocket1.Socket.SocketHandle, LocalSockName, SockNamelen);
end;
function WSocket_htons(hostshort: u_short): u_short;
begin
Result := Fhtons(hostshort);
end;
function WSocketResolveHost(InAddr : String) : TInAddr;
var
szData: array [0..256] of char;
IPAddr: u_long;
begin
StrPCopy(szData, Trim(InAddr));
IPAddr := FInet_addr(szData);
Result.s_addr := IPAddr;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
ProcName: String;
begin
FDllHandle := LoadLibrary(@winsocket[1]);
ProcName := 'inet_addr';
@FInet_addr := GetProcAddress(FDllHandle, @ProcName[1]);
ProcName := 'htons';
@Fhtons := GetProcAddress(FDllHandle, @ProcName[1]);
ProcName := 'bind';
@FBind := GetProcAddress(FDllHandle, @ProcName[1]);
end;
procedure GetHostInfo(var Name, Address: string);
var
WSAData: TWSAData;
HostEnt: PHostEnt;
begin
{ no error checking...}
WSAStartup(2, WSAData);
SetLength(Name, 255);
Gethostname(PChar(Name), 255);
SetLength(Name, StrLen(PChar(Name)));
HostEnt := gethostbyname(PChar(Name));
with HostEnt^ do
Address := Format('%d.%d.%d.%d',[
Byte(h_addr^[0]),
Byte(h_addr^[1]),
Byte(h_addr^[2]),
Byte(h_addr^[3])]);
WSACleanup;
end;
Bon il manque la gestion des erreurs et qq trucs (genre la libération du port ) mais à part ça ça marche
Marsh Posté le 29-11-2001 à 21:09:39
buitoni a écrit a écrit : Bravo |
Un peu grace à toi
Un composant arrive bientôt....
[edtdd]--Message édité par [SDF]Poire--[/edtdd]
Marsh Posté le 02-12-2001 à 01:06:33
[SDF]Poire a écrit a écrit : Un peu grace à toi Un composant arrive bientôt.... |
Oh, tu te mets aux composants? T'en as deja fait? C'est bien... Apres faudra le publier hein ;-)
Marsh Posté le 02-12-2001 à 13:43:02
buitoni a écrit a écrit : Oh, tu te mets aux composants? T'en as deja fait? C'est bien... Apres faudra le publier hein ;-) |
G déjà fait composant
Et bien sur que je publierai
Marsh Posté le 18-11-2001 à 20:54:34
Comment forcer le client (TClientSocket) à utiliser un port particulier pour se connecter au serveur (TServerSocket) ???
(le port dans les propriétés est le port du serveur)
Je veux spécifier le port avec lequel le client se connecte au serveur
Merci pour toutes réponses....
[edtdd]--Message édité par [SDF]Poire--[/edtdd]
---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love: