Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

[WIN32][C][DEV-C++] TESTSERV TELNET AMELIORE COLORATION SAUVEGARDE


Information sur la source

Catégorie :Réseaux & Internet Classé sous : socket, thread, telnet, couleur, fichier Niveau : Débutant Date de création : 30/06/2007 Vu / téléchargé: 3 909 / 257

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note


Description

Cliquez pour voir la capture en taille normale
Cet utilitaire très simple permet une connexion TCP à un serveur distant.

- il permet une sauvegarde dans le fichier "historique.txt"  de le connexion. (utilisation de "CreateFile", "WriteFile","CloseHandle")
- gestion avec thread (utilisation de "CreateThread")
- coloration d"un listview avec gestion de colonne (même qi une seul colonne ^^)
- implémentation des socket (création + envoie/réception...)

petite fonctions pratiques:
  - utilisation d'une DialogBox comme fenêtre principale
  - application d'une icone à la fenêtre principal
  - activer /désactiver un item...

Ce code est assez simple, j'espère que les débutants y trouveront leur bonheur :)
 

Source

  • //------------------------------------------------------------------------------
  • // Projet TestServ : Utilitaire de type Telnet avec enregistrement
  • // d'historique + coloration +sauvegarde des commandes
  • // Auteur : Hanteville Nicolas
  • // Fichier : main.c
  • // Version : 0.1
  • // Date de modification : 30/06/2007
  • // Description : programme principale + fonction / procédures
  • // Environnement : compatiblité DEVCPP / VISUAL C++ / BORLAND C++ 5.x
  • //------------------------------------------------------------------------------
  • #include "ressources.h"
  • //------------------------------------------------------------------------------
  • // ajout de l'item avec le texte en paramètre
  • //Type: FALSE = Envoie / TRUE = Réception
  • void AjouterItem(char *texte,BOOL Type)
  • {
  • char tmp[TAILLE_REQUETE];
  • char *t = texte;
  • LVITEM lvi;//une ligne
  • char car[2];
  • if (!Type)
  • {
  • strcpy(tmp,"Envoyé:");
  • strncat(tmp,texte,TAILLE_REQUETE);
  • strncat(tmp,"\0",TAILLE_REQUETE);
  • }else
  • {
  • strcpy(tmp,"Recue:");
  • while(*t++)
  • {
  • if (*t == '\r')
  • strncat(tmp,"<CR>",TAILLE_REQUETE);
  • else if (*t == '\n')
  • strncat(tmp,"<LF>",TAILLE_REQUETE);
  • else
  • {
  • car[0] = *t;
  • car[1] = 0;
  • strncat(tmp,car,TAILLE_REQUETE);
  • }
  • }
  • *t =0;//fin de la chaine
  • }
  • //ajout d'un item
  • lvi.mask = LVIF_TEXT|LVIF_PARAM;
  • lvi.iSubItem = 0;
  • lvi.lParam = 0;
  • lvi.pszText=tmp;
  • lvi.iItem = 0;
  • car[0] = ListView_InsertItem(H_LISTVIEW, &lvi);
  • if (log)//ajouter item au fichier de log
  • {
  • strncat(tmp,"\r\n",TAILLE_REQUETE);
  • WriteFile(HLog,tmp,strlen(tmp),&copiee,0);
  • }
  • ListView_RedrawItems(H_LISTVIEW,car[0],car[0]);
  • }
  • //------------------------------------------------------------------------------
  • // init de la connexion + traitement début de fichier
  • BOOL MyConnect()
  • {
  • //init du réseau
  • WSADATA wsaData;//variable pour initialisé la connexion
  • SOCKADDR_IN sinfo; // la configuration du socket
  • struct in_addr **a;
  • char tmp[TAILLE_REQUETE];
  • char serveur[TAILLE_REQUETE]="";
  • char port[TAILLE_PORT]="";
  • char *pt;
  • BOOL ETAT_IP = TRUE;
  • if (log)
  • {
  • //ouverture du fichier de log
  • HLog = CreateFile("Historique.txt",GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_FLAG_SEQUENTIAL_SCAN,0);
  • if (HLog == INVALID_HANDLE_VALUE)
  • {
  • CloseHandle(HLog);
  • return FALSE;
  • }
  • //on se place a la fin du fichier
  • SetFilePointer(HLog,GetFileSize(HLog,NULL),0,FILE_BEGIN);
  • }
  • if (!WSAStartup(0x0202,&wsaData))// si pas d'erreur
  • {
  • //init du socket
  • sock=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  • sinfo.sin_family = AF_INET;
  • //récupération du port
  • GetWindowText(H_PORT,port,TAILLE_PORT);
  • if (!port)
  • {
  • shutdown(sock,2);
  • WSACleanup();
  • MessageBox(0,"Port non valide!","Erreur!!!",MB_OK|MB_TOPMOST|MB_ICONWARNING);
  • return FALSE;
  • }
  • sinfo.sin_port = htons(atoi(port));
  • //récupération de l'adresse du serveur
  • GetWindowText(H_SERVEUR,serveur,TAILLE_REQUETE);
  • if (!serveur)
  • {
  • shutdown(sock,2);
  • WSACleanup();
  • MessageBox(0,"Adresse du serveur non valide","Erreur!!!",MB_OK|MB_TOPMOST|MB_ICONWARNING);
  • return FALSE;
  • }
  • //test si c'est une adresse ip ou autre
  • pt = serveur;
  • while(*pt && ETAT_IP)
  • {
  • if ((*pt <48 && *pt != 46) || (*pt >57 && *pt != 46)) //si pas un chiffre et pas un point alors pas une ip
  • ETAT_IP = FALSE;
  • pt++;
  • }
  • if (!ETAT_IP) //résolution du nom
  • {
  • struct hostent *host;
  • if (host=gethostbyname(serveur))
  • {
  • a = (struct in_addr **)host->h_addr_list;
  • sinfo.sin_addr.s_addr=inet_addr(inet_ntoa(**a));
  • }else
  • {
  • shutdown(sock,2);
  • WSACleanup();
  • MessageBox(0,"Résolution de l'adresse du serveur impossible","Erreur!!!",MB_OK|MB_TOPMOST|MB_ICONWARNING);
  • return FALSE;
  • }
  • }else
  • sinfo.sin_addr.s_addr=inet_addr(serveur);
  • //connexion
  • if (connect(sock,(SOCKADDR *)&sinfo,sizeof(sinfo))!=0)
  • {
  • closesocket(sock);
  • shutdown(sock,2);
  • WSACleanup();
  • MessageBox(0,"Connexion au serveur impossible","Erreur!!!",MB_OK|MB_TOPMOST|MB_ICONWARNING);
  • return FALSE;
  • }
  • //ajout sur le liste view de la trame de connexion
  • if (!ETAT_IP)
  • snprintf(tmp,TAILLE_REQUETE,"[]Connexion au serveur : \"%s\" (%s) port:%s Réussi!!!",serveur,inet_ntoa(**a),port);
  • else
  • snprintf(tmp,TAILLE_REQUETE,"[]Connexion au serveur : \"%s\" port:%s Réussi!!!",serveur,port);
  • AjouterItem(tmp,FALSE);
  • //lancement du thread de récupération
  • //MyThread = (HWND)CreateThread(NULL, 0,ThreadRec,0,0,&IDThread);
  • if (CreateThread(NULL, 0,ThreadRec,0,0,0) ==0)
  • {
  • closesocket(sock);
  • shutdown(sock,2);
  • WSACleanup();
  • MessageBox(0,"Réception des trames impossible","Erreur!!!",MB_OK|MB_TOPMOST|MB_ICONWARNING);
  • return FALSE;
  • }
  • return TRUE;
  • }else
  • return FALSE;
  • }
  • //------------------------------------------------------------------------------
  • // fonction de fin de connexion
  • DWORD WINAPI MyDisConnect(LPVOID lParam)
  • {
  • CONNECTEE = FALSE;
  • //désactive le bouton envoyer
  • EnableWindow(H_BUTTON_ENVOYER, FALSE);
  • //déconnexion
  • closesocket(sock);
  • shutdown(sock,2);
  • WSACleanup();
  • if (log)
  • {
  • WriteFile(HLog,"--------------------\n\n",22,&copiee,0);
  • CloseHandle(HLog);
  • }
  • }
  • //------------------------------------------------------------------------------
  • // fonction d'envoie de trames
  • DWORD WINAPI EnvoieTrame(LPVOID lParam)
  • {
  • char requete[TAILLE_REQUETE];
  • //récupération de la zone de texte
  • GetWindowText(H_COMMANDE,requete,TAILLE_REQUETE);
  • //ajout de la requète a la chaine ^^
  • if (requete[0] != 0)
  • SendMessage(H_COMMANDE, CB_ADDSTRING,0, (LPARAM)requete);
  • //poste traitement pour gestion d'affichage
  • strncat(requete,"\r\n",TAILLE_REQUETE); //retour a la ligne
  • //envoie
  • send(sock,requete,strlen(requete),0);
  • //ajout de la trame a la liste view
  • requete[strlen(requete)-2]=0;
  • strncat(requete,"<CR><LF>\0",TAILLE_REQUETE);
  • AjouterItem(requete,FALSE);
  • //vidage de la zone mémoire
  • SetWindowText(H_COMMANDE,"");
  • }
  • //------------------------------------------------------------------------------
  • // fonction de réception des trames
  • DWORD WINAPI ThreadRec(LPVOID lParam)
  • {
  • char requete[TAILLE_REQUETE];
  • //récupération en non bloquant
  • int retour=1;
  • //on quitte quand la connexion est terminé
  • //+le socket est fermé
  • //+ erreur de réception ou fin de connexion
  • while(CONNECTEE && retour > 0)
  • {
  • //récupération de la trame
  • retour = recv(sock,requete,TAILLE_REQUETE,0);
  • //affichage de la trame dans la liste view
  • if (retour > 0)
  • {
  • requete[retour]=0; // gestion \r\n
  • AjouterItem(requete,TRUE);
  • }
  • }
  • if (CONNECTEE)
  • {
  • //désactive le bouton envoyer
  • EnableWindow(H_BUTTON_ENVOYER, FALSE);
  • //déconnexion
  • CONNECTEE = FALSE;
  • closesocket(sock);
  • shutdown(sock,2);
  • WSACleanup();
  • }
  • AjouterItem("[]Déconnecté du serveur!!!",FALSE);
  • SetWindowText(H_BUTTON_CONNECTE,TXT_CONNECTE);
  • //active les paramètres
  • EnableWindow(H_PORT, TRUE);
  • EnableWindow(H_SERVEUR, TRUE);
  • EnableWindow(H_BUTTON_LOG, TRUE);
  • }
  • //------------------------------------------------------------------------------
  • //gestion des appels et msg sur le fenêtre principale
  • HRESULT DlgProc(HWND hwnd,UINT Msg,WPARAM Wparam,LPARAM lParam)
  • {
  • LPDRAWITEMSTRUCT lpDrawItem;
  • RECT rect;
  • char tmp [TAILLE_REQUETE];
  • switch(Msg)
  • {
  • case WM_DRAWITEM://permet la coloration des lignes
  • //traitement par ligne
  • lpDrawItem = (LPDRAWITEMSTRUCT)lParam;
  • if(ListView_GetItemState(H_LISTVIEW, lpDrawItem->itemID, LVIS_SELECTED) & LVIS_SELECTED)
  • // L'élément est séléctionné
  • FillRect(lpDrawItem->hDC, &lpDrawItem->rcItem, (HBRUSH)GetStockObject(GRAY_BRUSH));
  • else //fond des lignes
  • FillRect(lpDrawItem->hDC, &lpDrawItem->rcItem, GetSysColorBrush(COLOR_WINDOW));
  • //récupération du texte de la ligne + zone de l'item
  • ListView_GetItemText(H_LISTVIEW,lpDrawItem->itemID,0,tmp,TAILLE_REQUETE);
  • ListView_GetItemRect(H_LISTVIEW, lpDrawItem->itemID, &rect, LVIR_BOUNDS);
  • //si commence par
  • if (tmp[0] == 'R')//réception en rouge
  • {
  • SetTextColor(lpDrawItem->hDC,RGB(255, 0, 0));
  • }
  • else//sinon en bleu
  • {
  • SetTextColor(lpDrawItem->hDC,RGB(0, 0, 255));
  • }
  • //écriture du texte + zone d'écriture
  • rect.left+=2;
  • rect.right= rect.left + ListView_GetColumnWidth(H_LISTVIEW, 0)-4;
  • DrawText(lpDrawItem->hDC,tmp, strlen(tmp), &rect, DT_VCENTER);
  • break;
  • case WM_INITDIALOG:
  • InitCommonControls();
  • CONNECTEE = FALSE;
  • log = FALSE;
  • H_LISTVIEW=GetDlgItem(hwnd,LST_INFO);
  • H_BUTTON_ENVOYER=GetDlgItem(hwnd,BT_ENVOYER);
  • H_PORT = GetDlgItem(hwnd,PORT);
  • H_SERVEUR = GetDlgItem(hwnd,SERVEUR);
  • H_BUTTON_CONNECTE = GetDlgItem(hwnd,BT_CONNECT);
  • H_COMMANDE = GetDlgItem(hwnd,COMMANDE);
  • H_BUTTON_LOG = GetDlgItem(hwnd,BT_LOG);
  • EnableWindow(H_BUTTON_ENVOYER, FALSE);
  • //icone sur notre fenêtre
  • SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)LoadIcon(Hinst, MAKEINTRESOURCE(ID_ICON)));
  • LVCOLUMN lvc; //gestion colonne de la listeview
  • SendMessage(H_LISTVIEW,LVM_FIRST + 31,(WPARAM )0,(LPARAM )0);
  • lvc.mask = LVCF_TEXT|LVCF_WIDTH|LVCF_FMT;
  • lvc.fmt = LVCFMT_LEFT;
  • lvc.cx = 600; //taille colonne
  • lvc.pszText = "-- Commandes --"; //texte de la colonne
  • ListView_InsertColumn(H_LISTVIEW, 0, &lvc); //ajout colonne
  • break;
  • case WM_CLOSE:
  • PostQuitMessage(0);
  • break;
  • case WM_NOTIFY://gestion du double click sur un item
  • if ((LOWORD(Wparam) == LST_INFO) && (((LPNMHDR)lParam)->code == NM_DBLCLK))
  • {
  • char tmp[TAILLE_REQUETE];
  • //comptenu de la sélection
  • ListView_GetItemText(H_LISTVIEW,(unsigned int)SendMessage(H_LISTVIEW,LVM_GETNEXTITEM,(WPARAM)-1,LVNI_FOCUSED),0,tmp,TAILLE_REQUETE);
  • //on affiche
  • MessageBox(0,tmp,"Information Trame",MB_OK|MB_TOPMOST);
  • }
  • break;
  • case WM_COMMAND :
  • switch(LOWORD(Wparam))
  • {
  • case BT_ENVOYER:
  • CreateThread(NULL,0,EnvoieTrame,0,0,0);
  • break;
  • case BT_CONNECT:
  • if (CONNECTEE)
  • {
  • CreateThread(NULL,0,MyDisConnect,0,0,0);
  • }else
  • {
  • if (MyConnect())
  • {
  • CONNECTEE = TRUE;
  • SetWindowText(H_BUTTON_CONNECTE,TXT_DECONNECTE);
  • //active le bouton envoyer
  • EnableWindow(H_BUTTON_ENVOYER, TRUE);
  • //désactive les paramètres
  • EnableWindow(H_PORT, FALSE);
  • EnableWindow(H_SERVEUR, FALSE);
  • EnableWindow(H_BUTTON_LOG, FALSE);
  • }
  • }
  • break;
  • case BT_LOG://maj de la gestion des logs
  • if (!log) log=TRUE;
  • else log=FALSE;
  • break;
  • }
  • break;
  • }
  • return 0;
  • }
  • //------------------------------------------------------------------------------
  • //fonction principal (main)
  • int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hinstancePRECEDENTE, LPSTR CmdLine, int CmdShow)
  • {
  • Hinst = hInst;
  • //création de la fenêtre
  • DialogBox(0,MAKEINTRESOURCE(TestServeur),GetDesktopWindow(),(DLGPROC)DlgProc);
  • return 0;
  • }
//------------------------------------------------------------------------------
// Projet TestServ      : Utilitaire de type Telnet avec enregistrement 
//                        d'historique + coloration +sauvegarde des commandes
// Auteur               : Hanteville Nicolas
// Fichier              : main.c
// Version              : 0.1
// Date de modification : 30/06/2007
// Description          : programme principale + fonction / procédures
// Environnement        : compatiblité DEVCPP / VISUAL C++ / BORLAND C++ 5.x
//------------------------------------------------------------------------------
#include "ressources.h"
//------------------------------------------------------------------------------
// ajout de l'item avec le texte en paramètre
//Type: FALSE = Envoie / TRUE = Réception
void AjouterItem(char *texte,BOOL Type)
{
  char tmp[TAILLE_REQUETE];
  char *t = texte;
  LVITEM lvi;//une ligne
  char car[2];
  
  if (!Type)
  {
    strcpy(tmp,"Envoyé:");
    strncat(tmp,texte,TAILLE_REQUETE);
    strncat(tmp,"\0",TAILLE_REQUETE);
  }else
  {
    strcpy(tmp,"Recue:");
    while(*t++)
    {
      if (*t == '\r')
        strncat(tmp,"<CR>",TAILLE_REQUETE);
      else if (*t == '\n')
        strncat(tmp,"<LF>",TAILLE_REQUETE);
      else
      {
        car[0] = *t;
        car[1] = 0;
        strncat(tmp,car,TAILLE_REQUETE);
      }
    }
    *t =0;//fin de la chaine
  }

  //ajout d'un item
  lvi.mask = LVIF_TEXT|LVIF_PARAM;
  lvi.iSubItem = 0;
  lvi.lParam = 0;
  lvi.pszText=tmp;
  lvi.iItem = 0;
  car[0] = ListView_InsertItem(H_LISTVIEW, &lvi);
  
  if (log)//ajouter item au fichier de log
  {
    strncat(tmp,"\r\n",TAILLE_REQUETE);
    WriteFile(HLog,tmp,strlen(tmp),&copiee,0);
  }
  ListView_RedrawItems(H_LISTVIEW,car[0],car[0]);
}

//------------------------------------------------------------------------------
// init de la connexion + traitement début de fichier
BOOL MyConnect()
{
   //init du réseau
   WSADATA wsaData;//variable pour initialisé la connexion
   SOCKADDR_IN sinfo; // la configuration du socket 
   struct in_addr **a;
   
   char tmp[TAILLE_REQUETE];
   char serveur[TAILLE_REQUETE]="";
   char port[TAILLE_PORT]="";
   char *pt;
   BOOL ETAT_IP = TRUE;
   
   if (log)
   {
     //ouverture du fichier de log
     HLog = CreateFile("Historique.txt",GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_FLAG_SEQUENTIAL_SCAN,0);
     if (HLog == INVALID_HANDLE_VALUE) 
     {
       CloseHandle(HLog);
       return FALSE;
     }
     
     //on se place a la fin du fichier
     SetFilePointer(HLog,GetFileSize(HLog,NULL),0,FILE_BEGIN);
   }

   if (!WSAStartup(0x0202,&wsaData))// si pas d'erreur
   {
     //init du socket
     sock=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
     sinfo.sin_family = AF_INET;

     //récupération du port
     GetWindowText(H_PORT,port,TAILLE_PORT);
     if (!port)
     {
       shutdown(sock,2);
       WSACleanup();
       MessageBox(0,"Port non valide!","Erreur!!!",MB_OK|MB_TOPMOST|MB_ICONWARNING);
       return FALSE;
     }
     sinfo.sin_port = htons(atoi(port));
     
     //récupération de l'adresse du serveur
     GetWindowText(H_SERVEUR,serveur,TAILLE_REQUETE);
     if (!serveur)
     {
       shutdown(sock,2);
       WSACleanup();
       MessageBox(0,"Adresse du serveur non valide","Erreur!!!",MB_OK|MB_TOPMOST|MB_ICONWARNING);
       return FALSE;
     }
     
     //test si c'est une adresse ip ou autre
     pt = serveur;
     
     while(*pt && ETAT_IP)
     {
       if ((*pt <48 && *pt != 46) || (*pt >57 && *pt != 46)) //si pas un chiffre et pas un point alors pas une ip
         ETAT_IP = FALSE;
       pt++;
     }
      
     if (!ETAT_IP) //résolution du nom
      {
        struct hostent *host;
        if (host=gethostbyname(serveur))
        {
          a = (struct in_addr **)host->h_addr_list;
          sinfo.sin_addr.s_addr=inet_addr(inet_ntoa(**a));
        }else
        {
           shutdown(sock,2);
           WSACleanup();
           MessageBox(0,"Résolution de l'adresse du serveur impossible","Erreur!!!",MB_OK|MB_TOPMOST|MB_ICONWARNING);
           return FALSE;
        }
      }else
        sinfo.sin_addr.s_addr=inet_addr(serveur);
     
     //connexion
     if (connect(sock,(SOCKADDR *)&sinfo,sizeof(sinfo))!=0)
     {
           closesocket(sock);
           shutdown(sock,2);
           WSACleanup();
           MessageBox(0,"Connexion au serveur impossible","Erreur!!!",MB_OK|MB_TOPMOST|MB_ICONWARNING);
           return FALSE;
     }
  
     //ajout sur le liste view de la trame de connexion
     if (!ETAT_IP)
       snprintf(tmp,TAILLE_REQUETE,"[]Connexion au serveur : \"%s\" (%s) port:%s Réussi!!!",serveur,inet_ntoa(**a),port);
     else    
       snprintf(tmp,TAILLE_REQUETE,"[]Connexion au serveur : \"%s\" port:%s Réussi!!!",serveur,port);  
       
     AjouterItem(tmp,FALSE);

     //lancement du thread de récupération
     //MyThread = (HWND)CreateThread(NULL, 0,ThreadRec,0,0,&IDThread);
     if (CreateThread(NULL, 0,ThreadRec,0,0,0) ==0)
     { 
         closesocket(sock);
         shutdown(sock,2);
         WSACleanup();
         MessageBox(0,"Réception des trames impossible","Erreur!!!",MB_OK|MB_TOPMOST|MB_ICONWARNING);
         return FALSE;
     }
     return TRUE;
   }else
     return FALSE;
}
//------------------------------------------------------------------------------
// fonction de fin de connexion
DWORD  WINAPI  MyDisConnect(LPVOID lParam)
{
   CONNECTEE = FALSE;
   
   //désactive le bouton envoyer
   EnableWindow(H_BUTTON_ENVOYER, FALSE);
   
   //déconnexion
   closesocket(sock);
   shutdown(sock,2);
   WSACleanup();

   if (log)
   {
       WriteFile(HLog,"--------------------\n\n",22,&copiee,0);
       CloseHandle(HLog);
   }
}

//------------------------------------------------------------------------------
// fonction d'envoie de trames
DWORD  WINAPI EnvoieTrame(LPVOID lParam)
{
  char requete[TAILLE_REQUETE];
  //récupération de la zone de texte
  GetWindowText(H_COMMANDE,requete,TAILLE_REQUETE);
  
  //ajout de la requète a la chaine ^^
  if (requete[0] != 0)
    SendMessage(H_COMMANDE, CB_ADDSTRING,0, (LPARAM)requete);
  
  //poste traitement pour gestion d'affichage
  strncat(requete,"\r\n",TAILLE_REQUETE); //retour a la ligne
  //envoie
  send(sock,requete,strlen(requete),0);
  
  //ajout de la trame a la liste view
  requete[strlen(requete)-2]=0;
  strncat(requete,"<CR><LF>\0",TAILLE_REQUETE);
  
  AjouterItem(requete,FALSE);
  
  //vidage de la zone mémoire
  SetWindowText(H_COMMANDE,"");
}
//------------------------------------------------------------------------------
// fonction de réception des trames
DWORD  WINAPI ThreadRec(LPVOID lParam)
{
  char requete[TAILLE_REQUETE];
  //récupération en non bloquant
  int retour=1;
  
  //on quitte quand la connexion est terminé
  //+le socket est fermé 
  //+ erreur de réception ou fin de connexion
  while(CONNECTEE && retour > 0)
  {
    //récupération de la trame
    retour = recv(sock,requete,TAILLE_REQUETE,0);
    
    //affichage de la trame dans la liste view
    if (retour > 0)
    {
       requete[retour]=0; // gestion \r\n
       AjouterItem(requete,TRUE);
    }
  }

  if (CONNECTEE)
  {
    //désactive le bouton envoyer
    EnableWindow(H_BUTTON_ENVOYER, FALSE);
  
    //déconnexion
    CONNECTEE = FALSE;
    closesocket(sock);
    shutdown(sock,2);
    WSACleanup();
  }
  
  AjouterItem("[]Déconnecté du serveur!!!",FALSE);  
   
  SetWindowText(H_BUTTON_CONNECTE,TXT_CONNECTE);
                
  //active les paramètres
  EnableWindow(H_PORT, TRUE);
  EnableWindow(H_SERVEUR, TRUE);
  EnableWindow(H_BUTTON_LOG, TRUE);
}
//------------------------------------------------------------------------------
//gestion des appels et msg sur le fenêtre principale
HRESULT DlgProc(HWND hwnd,UINT Msg,WPARAM Wparam,LPARAM lParam) 
{
  LPDRAWITEMSTRUCT lpDrawItem;
  RECT rect;
  char tmp [TAILLE_REQUETE];
  
  switch(Msg) 
  {
      case WM_DRAWITEM://permet la coloration des lignes
           //traitement par ligne
           lpDrawItem = (LPDRAWITEMSTRUCT)lParam;     
             
           if(ListView_GetItemState(H_LISTVIEW, lpDrawItem->itemID, LVIS_SELECTED) & LVIS_SELECTED)
              // L'élément est séléctionné
              FillRect(lpDrawItem->hDC, &lpDrawItem->rcItem, (HBRUSH)GetStockObject(GRAY_BRUSH));
           else //fond des lignes
             FillRect(lpDrawItem->hDC, &lpDrawItem->rcItem, GetSysColorBrush(COLOR_WINDOW));
             
           //récupération du texte de la ligne + zone de l'item
           ListView_GetItemText(H_LISTVIEW,lpDrawItem->itemID,0,tmp,TAILLE_REQUETE);
           ListView_GetItemRect(H_LISTVIEW, lpDrawItem->itemID, &rect, LVIR_BOUNDS);
           
           //si commence par 
           if (tmp[0] == 'R')//réception en rouge
           {
             SetTextColor(lpDrawItem->hDC,RGB(255, 0, 0));
           }
           else//sinon en bleu
           {
             SetTextColor(lpDrawItem->hDC,RGB(0, 0, 255));
           }   
           
           //écriture du texte + zone d'écriture
           rect.left+=2;
           rect.right= rect.left + ListView_GetColumnWidth(H_LISTVIEW, 0)-4;
           DrawText(lpDrawItem->hDC,tmp, strlen(tmp), &rect, DT_VCENTER);
      break; 
      case WM_INITDIALOG:
        InitCommonControls();
        CONNECTEE = FALSE;
        log = FALSE;
        H_LISTVIEW=GetDlgItem(hwnd,LST_INFO);
        H_BUTTON_ENVOYER=GetDlgItem(hwnd,BT_ENVOYER);
        H_PORT = GetDlgItem(hwnd,PORT);
        H_SERVEUR = GetDlgItem(hwnd,SERVEUR);
        H_BUTTON_CONNECTE = GetDlgItem(hwnd,BT_CONNECT);
        H_COMMANDE = GetDlgItem(hwnd,COMMANDE);
        H_BUTTON_LOG = GetDlgItem(hwnd,BT_LOG);
        EnableWindow(H_BUTTON_ENVOYER, FALSE);
        
        //icone sur notre fenêtre
        SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)LoadIcon(Hinst, MAKEINTRESOURCE(ID_ICON))); 
        
        
        LVCOLUMN lvc;     //gestion colonne de la listeview
        SendMessage(H_LISTVIEW,LVM_FIRST + 31,(WPARAM )0,(LPARAM )0);
        lvc.mask = LVCF_TEXT|LVCF_WIDTH|LVCF_FMT;
        lvc.fmt = LVCFMT_LEFT;
        lvc.cx = 600;       //taille colonne
        lvc.pszText = "-- Commandes --"; //texte de la colonne
        ListView_InsertColumn(H_LISTVIEW, 0, &lvc); //ajout colonne 
        
      break;
      case WM_CLOSE:
    	  PostQuitMessage(0);
      break;
      case WM_NOTIFY://gestion du double click sur un item
           if ((LOWORD(Wparam) == LST_INFO) && (((LPNMHDR)lParam)->code == NM_DBLCLK))
          {
            char tmp[TAILLE_REQUETE];
            
            //comptenu de la sélection
            ListView_GetItemText(H_LISTVIEW,(unsigned int)SendMessage(H_LISTVIEW,LVM_GETNEXTITEM,(WPARAM)-1,LVNI_FOCUSED),0,tmp,TAILLE_REQUETE);
            
            //on affiche
            MessageBox(0,tmp,"Information Trame",MB_OK|MB_TOPMOST);
          }
           
      break;
      case WM_COMMAND :
           switch(LOWORD(Wparam))
           {
             case BT_ENVOYER:
                  CreateThread(NULL,0,EnvoieTrame,0,0,0);
             break;
             case BT_CONNECT:
                  if (CONNECTEE)
                  {
                    CreateThread(NULL,0,MyDisConnect,0,0,0);
                  }else
                  {
                    if (MyConnect())
                    {
                      CONNECTEE = TRUE;
                      SetWindowText(H_BUTTON_CONNECTE,TXT_DECONNECTE);
                      
                      //active le bouton envoyer
                      EnableWindow(H_BUTTON_ENVOYER, TRUE);
                      //désactive les paramètres
                      EnableWindow(H_PORT, FALSE);
                      EnableWindow(H_SERVEUR, FALSE); 
                      EnableWindow(H_BUTTON_LOG, FALSE); 
                    }
                  }
             break;
             case BT_LOG://maj de la gestion des logs
             if (!log) log=TRUE;
             else log=FALSE;
             break;
           }
      break;
   }     
   return 0;        
}

//------------------------------------------------------------------------------
//fonction  principal (main)
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hinstancePRECEDENTE, LPSTR CmdLine, int CmdShow) 
{  
  Hinst = hInst;
  
  //création de la fenêtre
  DialogBox(0,MAKEINTRESOURCE(TestServeur),GetDesktopWindow(),(DLGPROC)DlgProc); 
  return 0;
}

Conclusion

N'hésitez pas à poser des questions :)
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de coucou747 le 30/06/2007 16:49:18

J'ai pas lu ton code, je passais, et j'ai eu une idee : on m'avait demande de faire un truc pour un club robotique qui pourrait gerer un envoi/reception sur un port serie, ca, ca ressemble a peu pres a ce que tu as fait, sauf que toi tu envois sur eth :)

le defis : pouvoir envoyer / recevoir du binaire, mettre en forme comme on le voulait : certaines parties en hexa, d'autres en octale, d'autres en binaire, d'autres en decimales, d'autres sous forme classiques... faire des especes de masques genre comme les boucles sur les partitions de musiques : \d4 prendrait 4 octets pour afficher la valeur en decimale, idem pour \o, \h, \b, \c; {x} repeterait x fois le code precedent, faut alors gerer les parentheses, et ca bouclerait ainsi :) ces masques seraient activables sur des especes de blocks que l'on pourrait couper a notre guise...
(\c\d4){15}
(faudrait pouvoir sauver ces masques pour gerer n'importe quel type de protocol)

c'est une idee d'evolution

signaler à un administrateur
Commentaire de omnia le 01/07/2007 11:42:17

Salut,

le code ici n'est qu'un exemple, mais effectivement la mise en place d'un système de script, avec une gestion pour udp , port série est possible.

Mais dans le cas présent le but a cours therme est un telnet avec une gestion d'interface avec des commande prés enregistrés.

Maintenant libre a tous de l'utiliser comme il le souhaite :p

signaler à un administrateur
Commentaire de Darksheep le 21/08/2007 16:33:40

Bizarre avec moi ça ne marches pas : Résolution de l'adresse du serveur impossible
(www.google.fr , port 80)
j'ai devcpp (lastv)

signaler à un administrateur
Commentaire de omnia le 21/08/2007 16:40:33

salut,

  tu as peut-être un firewall, ou un logiciel qui bloque son fonctionnement, peut-être un proxy ou un dns mal renseigné (tout cela viens de ta configuration non de l'application).

ciao

signaler à un administrateur
Commentaire de Darksheep le 22/08/2007 09:05:39

En effet autant pour moi :)
(cause : ZoneAlarm,Meme si je le config bien :'( jle jarte !)
10/10 !

signaler à un administrateur
Commentaire de mitch97 le 27/08/2007 15:11:30

Bonjour,
J'ai un petit soucis, chez moi, l'exe fonctionne super bien et je félicite OMNIA mais le problème est que je n'arrive pas a compiler le code. j'ai des erreurs du genre "invalid conversion from 'char* to size_t' à la ligne 25. Bien sur ce n'est pas la seule erreur. pourtant j'essaie de compiler avec DEV C++. Si quelqu'un pouvais me venir en aide ca serait cool. merci d'avance.

signaler à un administrateur
Commentaire de omnia le 23/09/2007 12:33:26

salut, mitch97 ,  met tes erreurs j'esserais de les corriger.

désolé de répondre si tardivement :)

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Envoyer et recevoir un fichier par Socket en C [ par coolboy78 ] Bonjour,j'aimerai Envoyer et recevoir un fichier par Socket en C. Mais je n'ai pas trouvé de fonction ni d'exemple pour ceci.Si kelkun pouvez maider, Thread et socket [ par epoc ] Petite question.J'ai créé un petit serveur avec un socket 'bloquant'. Etant donné que je désire que mon aplication ne soit pas bloquée j'ai créé un th Pb reseau -> SOCKET [ par Haldwin ] Salut à tous,Voila j'expose mon pb!!!!J'essaie de faire une appli Client/serveur qui me permette de visionner mon ecran de PC à distance (enfin en LAN Thread et socket udp [ par eurysthe ] Bonjour !!Voila j'ai un petit problème de thread qui me pourrit la vie.J'ai crée un thread qui doit écouter en boucle les informations qui transite su probleme avec ifstream et ofstream [ par kobee12 ] J'ai un petit probleme dans mon programme. J'ai voulu inserer une fonction de cryptage pour crypter et decrypter un fichier. Le probleme c'est que j'a [serveur]telecharger fichier [ par lombredudragon ] Avec les socket je debute et j'aimerais me faire un serveur en c ou c++ ou kan on se connect au port 23 par telnet on recoit automatiquement un fichie Serveur Telnet C++ Aide sur IP [ par hergo ] Bonjour je suis debutant et j'aimerai savoir comment recuperer l'ip dun client qui se connect a un serveur telnet:jai recuperer ce serveur telnet si j Socket [ par c2millet ] Bonjour à tous,je voudrais dans un premier tps si qqun a ou connais une doc sur les sockets. Ensuite, g un petit pb. g réalisé un serveur qui lit sur Probleme thread [ par PunkDude424 ] J'ai un probleme avec les threadJ,ai un server et jessai de créer un thread a chaque fois quun client se connecte, mais sa fonctionne pas.J,ai essayer Socket [ par casper_2 ] Excuser moi,bonjour.J'ai un leger problem avec les sockets.kan je te recupere les donn&#233;es d'un fichier zip&#233; sur un serveur,a l'ouverture de


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,359 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.