IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Envoi de donées par socket, petit soucis .


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 32
    Par défaut Envoi de donées par socket, petit soucis .
    Bonjour,

    Toujours dans mon project perso sous borland.
    J'ai le besoin d'envoyer des donnée par une socket.

    Mon probleme, il y'a apparement 3 Composant Socket possible.
    - TClientSocket/TServerSocket
    - TPowersock
    - Indy Client / Indy Server

    Alors quelle est la meilleur solution ??

    J'ai par ailleur de mon coté deja pris parti pour la solution : TClientSocket/TServerSocket

    Je parviens a faire des echange de donnée par les methodes :
    SendText() et ReceiveText(), mais sur de gros transfert il semble que cela plante. Pourquoi es-ce aussi peu fiable ??

    J'ai vu qu'il y avait les methodes SendBuf et ReceiveBuf, mais j'ai du mal a comprendre leur fonctionement conjontement avec la methode ReceiveLenght().

    Bref Quelqu'un pourrait il me sortir un bon code pour utiliser les methode avec buffer
    (j'ai vu quelques exemple sur le forum, mais me paraissait flou :/ )
    A savoir que mon souhait serait de faire un tunnelier et donc d'envoyer sur une socket client ce que je recois d'une socket server, et vice-versa .
    Le tout fonctionnant avec plusieurs connexions possible (plusieurs thread).

    Merci d'avance =)

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 32
    Par défaut
    c'est encore moi
    Bien j'ai finalement reussit a utiliser les methode SendBuf et ReceiveBuf .

    Par contre mon programme semble marcher correctement dans certain cas et pas dans d'autre.
    Je suis bloqué il me faudrait quelqun pour m'aider a trouver le probleme :/

    quand je creer un tunnel de localhost:81 -> free.fr:80
    Si avec telnet je me connect sur localhost:81 et que je tape 'GET /index.php'
    Je reçois bien la page.

    Mais si j'utilise un navigateur avec pour addresse 'localhost:81' .
    Le navigateur semble attendre des données qui n'arrivent jamais.

    Es-ce que certain accepterais de tester mon programme de leur coté pour trouver le problem. ?

  3. #3
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Les navigateurs utilisent d'habitude le champ "Content-Lenght" de l'entete pour savoir combien de donnée il faut lire. Si tu n'envoies pas ce champ au navigateur, il se peut qu'il attende indefiniment.


    Header Field Definitions
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 32
    Par défaut
    je viens de trouver le probleme
    mais pas la solution

    mon programme :


    en fait, lorsque firefox se connecte a ma socket serveur, il envoi directement les donnée d'entete par la socket, et mon programme na pas eu le temps d'achever la connexion vers le client, donc les donnée que firefox a envoyé sont tout simplement perdus..

    Voila mon code avec le petit probleme dedant.
    void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
    TCustomWinSocket *Socket)
    {

    int len=Socket->ReceiveLength();
    char* Buffer = new char [len+1];
    Socket->ReceiveBuf((void*)Buffer,len);

    /* ici il faudrait attendre que ClientSocket1 soit bien connecté */
    ClientSocket1->Socket->SendBuf((void*)Buffer,len);
    LogPrint("Client->Bridge ("+AnsiString(len)+" octet)",clBlack);

    delete Buffer;

    }
    J'ai essayer :
    while(ClientSocket1->Active!=true);

    Mais sa plante le programme :/
    Voila si quelqun a une idee

  5. #5
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    TWinSocketStream *stream = new TWinSocketStream(/*....*/); 
    if (stream->WaitForData(60)) { // Wait for 60sec max
      /* ... */
    }
    plus d'info: Tutorial for creating a threaded socket server and client application
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 32
    Par défaut
    merci pour ce lien
    Apres quelques tensions, je suis parvenus a faire marcher le code.
    Mais je suis a nouveau devant un probleme.

    Dans mon thread client je desire Ouvrir une connexion vers un client distant.
    Mais j'ai beau tout essayer, c'est comme si la ligne ClientSocket1->Open();
    Eté sauté.
    void __fastcall TMyServerThread::ClientExecute(void)
    {
    while (!Terminated && ClientSocket->Connected)
    {
    try
    {
    Form1->ClientSocket1->Open();
    TWinSocketStream *pStream = new TWinSocketStream(ClientSocket, CLIENTWAITTIME);

    try
    {
    char buffer[BUFFERSIZE];
    memset( buffer, 0, sizeof(buffer) );

    if(pStream->WaitForData(CLIENTWAITTIME))
    {
    if (pStream->Read(buffer, sizeof(buffer)) == 0)
    ClientSocket->Close();
    else
    {
    Form1->Memo1->Lines->Add(AnsiString("(Client) ") +AnsiString(buffer) );
    Form1->ClientSocket1->Socket->SendText(buffer);
    pStream->Write( buffer, sizeof(buffer));
    }

    // ...
    // Process requests here.
    // ...
    ClientSocket->Close();

    }
    else
    ClientSocket->Close();
    }
    __finally
    {
    delete pStream;
    }
    }
    catch (...)
    {
    HandleException();
    }
    }
    }
    Et pourtant avec un bouton sur la form1 si je met dans levenement Click :
    ClientSocket1->Open();

    Alors la connexion se fait, mais seulement si aucun threadclient du server n'a été lancé.

    Et C'est possible de faire en sorte qu'a chaque fois qu'un Thread se lance, Alors on crée un nouvelle connexion vers mon fameux client distant .?
    car j'ai essayer quelque chose comme :
    TClientSocket* client = new TClientSocket;

    Mais sa a pas lair de vouloir :s

Discussions similaires

  1. Envoi de Fichier par Socket
    Par devalender dans le forum WinDev
    Réponses: 2
    Dernier message: 20/06/2008, 12h59
  2. Envoie de fichier par socket
    Par eracius dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 05/10/2007, 11h21
  3. Envoi de fichier par socket
    Par thebloodyman dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 30/08/2007, 17h07
  4. Envoi de fichier par socket
    Par dr_octopus74 dans le forum Réseau
    Réponses: 42
    Dernier message: 19/01/2007, 17h59
  5. [Débutant] Envoi de fichier par socket
    Par zapho dans le forum Entrée/Sortie
    Réponses: 13
    Dernier message: 26/05/2004, 18h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo