2011-03-05 2 views
3

ive un serveur TIdTCPServer en cours d'exécution, et le client en utilisant le navigateur Web (ou tout autre logiciel) pour communiquer, je ne sais pas le protocole, mais ce que j'essaie de faire est d'envoyer les données entre le client et une autre connexion (les deux connectés au même TIdTCPServer) par exemple les données envoyées par le premier client sont transmises au second client, et les données envoyées par le second client sont transmises au premier client, comme un proxy (i ne peut pas vraiment utiliser un serveur proxy puisque c'est juste cette condition) et le TIdTCPServer devrait toujours recevoir d'autres clients et traiter leurs données.Transférer des données directement entre 2 connexions dans Indy (TIdContext)

Je suis tombé sur la première ligne de code, puisque TIdContext.Connection.Socket.ReadLn nécessite un délimiteur, et le protocole du client est inconnu du serveur.

des idées?

merci.

+1

Peut-être que le composant TIdMappedPortTCP dans Indy est utile, avec quelques modifications - voir http://stackoverflow.com/questions/4136226/proxy-server-using-indy – mjn

+1

Lorsque j'ai été confronté à ce même problème, j'ai utilisé [ICS - Internet Component Suite] (http://www.overbyte.be/frame_index.html?redirTo=/products/ics.html) components: Contrairement à Indy, ils ne bloquent pas, donc vous pouvez facilement recevoir ET envoyer en même temps. –

+0

je ne peux pas utiliser TIedMappedPortTCP car c'est en fait un serveur, avec beaucoup de fonctions, fournissant des informations et d'autres choses, et juste une fonction à l'intérieur du serveur, pour emmener le client à un autre client, et je ne peux pas passer à ICS développement: ( – killercode

Répondre

3

Vous pouvez regarder le code source pour TIdMappedPortTCP et TIdHTTPProxyServer pour voir comment ils transmettent des données arbitraires entre les connexions dans les deux directions. Les deux composants utilisent TIdSocketList.SelectReadList() pour détecter si l'une des connexions a des données à lire. TIdMappedPortTCP utilise ensuite TIdBuffer.ExtractToBytes() et TIdIOHandler.Write(TIdBytes), tandis que TIdHTTPProxyServer utilise à la place TIdTCPStream et TIdBuffer.ExtractToStream().

+0

c'est très très compliqué depuis que je n'ai jamais vraiment regardé Indy Source avant, et même si je l'ai fait, je ne pense pas être en mesure de rendre mon nouveau code multiplateforme – killercode

+0

Indy est une bibliothèque multiplateforme. J'ai décrit les travaux sur toutes les plates-formes Il existe de nombreuses façons de transférer des données entre plusieurs objets 'TIdContext', en fonction de ce que vous avez réellement besoin de transférer. –

Questions connexes