Client(c++Builder)/Serveur(linux)

willixs Messages postés 1 Date d'inscription lundi 11 mai 2009 Statut Membre Dernière intervention 12 mai 2009 - 12 mai 2009 à 14:59
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 - 12 mai 2009 à 17:49
Bonjour j'ai fait un socket client sur c++ builder et un serveur socket sur linux mais j'ai un probleme c'est que j'ai créé un tableau de caractères sur mon serveur que j'envoie à mon Client,cependant j'ai du mal à bien afficher les valeurs envoyées sur mon ihm Client .je veux que ca m'affiche les valeurs définies dans mon tableau.

code Serveur :
main :
/*#ifdef HAVE_CONFIG.H
#include <config.h>
#endif*/
//#include <stdlib.h>
//#include <stdio.h>
//#include
//using namespace std;
#include "./CSocket.h"
#include "ConvStrInt.h"


using namespace std;


int main()
{   int test,ad,seuil[60];
//int seuili;
    char * seuila;
    int i= 0,j=0,k=0;
    char temp[8][3];
    //float temperature[8];
    char temperature[16]={1234,02,3,4,5,6,7,8,9,10,11,12,13,14,15,16};


    cout << "MODULE SERVEUR SOCKET FOX" << endl;
   //Instanciation de la classe CSocket
    CSocket *socketFox = new CSocket();
    //NOMINATION SOCKET
    test = socketFox->nommer_socket();
// ATTENTE CONNEXION
    test = socketFox->attendre_connexion();
//ACCEPTATION CONNEXION
    test=socketFox->accepter_connexion();
    cout<<"CLIENT CONNECTÉ : attente caractère "<< endl;
//RECEPTION CHAR
//int i=0;


   /* ad=socketFox->recevoir();
    seuila=(char *)ad;
    cout<< seuila <<endl;
    ConvStrInt *Conversion = new ConvStrInt();
    while(j<8)
    {   while(seuila[i]!='.')
        {   temp[j][k]=seuila[i];
            i++;
            k++;
        }
        temp[j][k]=0x00;
        cout << temp[j] << endl;
        Conversion->Conv(temp[j]);
        k=0;
        j++;
        i++;
    }
    cout << "Fin conversion" << endl;*/


    socketFox->envoyer(temperature); //J'envoie mon ta
    socketFox->~CSocket();
    cout<<"Client déconnecté "<<endl;
    return 0;
}

CSocket.h
#ifndef CSOCKET_H_INCLUDED
#define CSOCKET_H_INCLUDED
//#include <stdio.h>
//#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include
#include
#include <netinet/in.h>
#include "ConvStrInt.h"
//#include <stdlib.h>
const int MAXCONNECTIONS = 5 ;
class CSocket
{   public:
        char valeur[60];
                char  *donnees;
                CSocket();
        ~CSocket();
        int nommer_socket();
        int attendre_connexion();
        int accepter_connexion();


        //TRANSMISSION DE DONNEES


        int recevoir();
                int envoyer(char* );


//CLIENT INITIALISATION
        int connexion();


    private:
        int test,idSockServ,idSockClient;
        //sockaddr_un m_addr;
//int server_sockfd, client_sockfd;
    int server_len, client_len;
    struct sockaddr_in server_address , client_address;


};




#endif // CSOCKET_H_INCLUDED

CSocket.cpp
#include "./CSocket.h"


CSocket::CSocket()
{   cout << "Instanciation de la classe CSocket" << endl;
    idSockServ=socket( AF_INET, SOCK_STREAM,0);
    if(idSockServ==-1)
    {   cout<<"\n Création du socket : IMPOSSIBLE "<<endl;
        perror("Erreur Création du socket");
        exit(-1);
    }
    else
    cout<<"\n Création du socket : OK " <<"IDENTIFIANT : " << idSockServ << endl;
}


CSocket::~CSocket()
{


    cout << "Fermeture socket" << endl;
    close(idSockServ);


};


//NOMINATION SOCKET
int CSocket::nommer_socket()
 {  int tr=1;
    if (setsockopt(idSockServ,SOL_SOCKET,SO_REUSEADDR,&tr,sizeof(int)) == -1)
    {
    perror("setsockopt");
    exit(1);
    }
    //REMPLISSAGE DES STRUCTURES
    server_address.sin_family = AF_INET;
    server_address.sin_addr.s_addr=htonl(INADDR_ANY);
    server_address.sin_port=htons(9734);
    server_len=sizeof(server_address);
    test= bind(idSockServ, (struct sockaddr *) &server_address, sizeof (server_address));
    if(test==-1)
    {   cout << "\n Nomination du socket : IMPOSSIBLE" << endl;
        perror("ERREUR DE TYPE");
        this->~CSocket();
        exit(-1);
    }
    else
    cout << "\n Nomination du socket : OK" << endl;
    return(0);
 }
//ATTENTE CONNEXION
int CSocket::attendre_connexion()
{   test = listen (idSockServ,5);
    if(test==-1)
    {   perror("listen KO");
        this->~CSocket();
        exit(-1);
    }
    cout << "listen OK" << endl;
    return(0);
}


//ACCEPTER CONNEXION
int CSocket::accepter_connexion()
{   int addr_lenght = sizeof(server_address);
   idSockClient=accept(idSockServ, (sockaddr *) &client_address, (socklen_t *) &addr_lenght );
    if(idSockClient==-1)
    {   perror("Acceptation KO");
        this->~CSocket();
        exit(-1);
    }
    cout << "Acceptation OK " << client_address.sin_addr.s_addr << endl;
    return(idSockClient);
}


 


//recevoir


int CSocket::recevoir()
{   test=read(idSockClient, valeur, 60);
    if(test==-1)
    {   perror("Réception KO ");
        this->~CSocket();
        exit(-1);
    }
    //printf("Seuil : %s\n",seuil);
    //for (int i=0;i<8;i++)
    {     cout << "Réception OK " << test << endl;
    }
    return ((int)valeur);
}
//ENVOYER
int CSocket::envoyer(  char* donnees)
{   //cout << "\n message à envoyer :" <<donnees<< endl;
    for (int i=0;i<8;i++)
    {   cout<< donnees[i] << endl;
        test=write(idSockClient,donnees, 8);
        if(test==-1)
        {   perror("Emission KO ");
            this->~CSocket();
            exit(-1);
        }
        donnees++;
    }
        {
        cout << "Envoi OK " << test << endl;
        }
    return(test);
}




                                                                                           //CONNEXION
int CSocket::connexion()
{   //m_addr.sun_family = AF_INET;
    //strcpy(m_addr.sun_path,"socket_serveur");
    test = connect(idSockServ, (sockaddr *) &server_address,sizeof (server_address));
     if(test==-1)
    {   perror("Connexion KO");
        this->~CSocket();
        exit(-1);
    }
    cout << "Connexion OK" << endl;
    return(0);
}

Coode Client sous C++ Builder:

IHM.cpp

//---------------------------------------------------------------------------


#include <vcl.h>
#pragma hdrstop
#include "IHM.h"
#include "Configuration.h"
#include <winbase.h>
#include <windows.h>
#include
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;


//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
ClientSocket1->Open();


//---------Affichage de la date à l'ouverture de la fenêtre------------------------------------------------------------------
Horloge->Caption=DateTimeToStr(Now());


}


//--Quand on clique sur le bouton configurer ,cela affiche la page de configuration -------------------------------------------------------------------


void __fastcall TForm1::Bu_Config_SeuilClick(TObject *Sender)
{
Form2->Visible=true;


}


 


//---------------------------------------------------------------------------


void __fastcall TForm1::Ed_companyChange(TObject *Sender)
{
Panel1->Caption=Ed_company->Text;       
}
//---------------------------------------------------------------------------


void __fastcall TForm1::ClientSocket1Connect(TObject *Sender,
      TCustomWinSocket *Socket)
{
Ed_Etat->Text="La communication est établie avec la carte FOX";       
}
//---------------------------------------------------------------------------


void __fastcall TForm1::ClientSocket1Error(TObject *Sender,
      TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
ShowMessage("Erreur, Verifier que la carte FOX est à l'écoute du client");
}
//------Reception Tableau envoyé par serveur---------------------------------------------------------------------


void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
      TCustomWinSocket *Socket)
{
Edit9->Text=Socket->ReceiveText();
}

1 réponse

fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
12 mai 2009 à 17:49
char temperature[16]={1234,02,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
un char qui vaut 1234, ca me fait peur sachant que ses limites sont -128 / +127

utilise wireshark (ou ethereal) pour espoinner les trames IP. Ca aide a comprendre les 'bug' de programmation.
0
Rejoignez-nous