|
Dernière réponse | ||
---|---|---|
Sujet : [Delphi] Forcer le port d'un client (TClientSocket) ??? | ||
[SDF]Poire |
|
Aperçu |
---|
Vue Rapide de la discussion |
---|
[SDF]Poire |
|
Buitoni |
|
[SDF]Poire |
[edtdd]--Message édité par [SDF]Poire--[/edtdd] |
Buitoni | Bravo
:hello: |
[SDF]Poire | 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 :D ) mais à part ça ça marche :D |
[SDF]Poire | C bon G trouvé !!!!!!!!!!!!!!!!!!!!! :D :D :D :D Merci à Buitoni :jap: :hello: Antp :jap: :hello: François Piette :jap: :jap: :hello: FOBEC :jap: :jap: :hello: Catherine Verdier :hello: Merci Le code arrive bientôt.... Lundi déjà j'aurai pu trouver.... (tout ça à cause d'un oubli de stdcall) Merci encore à tous :hello: |
[SDF]Poire | 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] |
[SDF]Poire | Bon j'y suis presque.....
Y a un truc avec TSockAddrIn et TCustomWinSocket.InitSocket Mais j'arrive pas à conclure..... |
Buitoni |
|
[SDF]Poire |
|
[SDF]Poire |
|
Buitoni |
|
[SDF]Poire | 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..... :ange: ) :hello: |
[SDF]Poire |
|
Buitoni | http://overbyte.alexid.fr/frame_index.html
Va voir ca, les sources y sont aussi et le mec est Belge (comme moi ;p) |
[SDF]Poire |
|
Buitoni | 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 :lol: 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... |
[SDF]Poire | 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é :fou: 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.... :D 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] |
[SDF]Poire |
|
Buitoni | Ca change pas tant que ca par rapport au TClientSocket hein :) |
[SDF]Poire |
[edtdd]--Message édité par [SDF]Poire--[/edtdd] |
Buitoni |
|
[SDF]Poire |
|
[SDF]Poire | Merci !!!!!!!!!!!!!!!!! :jap:
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 :jap: :jap: :jap: (Merci Antp aussi :D ) |
Buitoni | 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 |
antp |
[edtdd]--Message édité par antp--[/edtdd] |
Buitoni | 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 |
[SDF]Poire | :cry: :cry: :cry: :spookie: |
[SDF]Poire | :bounce: up :bounce: C important.... Personne à une réponse ? |
[SDF]Poire | 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] |