begin process at 2012 05 27 19:33:21
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseaux & Internet

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

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


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :5 518 / 347

Auteur : omnia

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
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

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture [WIN32][CB]CRÉATION DIRECTE DE PDF
[C][RTF] EXEMPLE DE TABLEAU EN RTF (POUR RICHEDIT)
Source avec Zip [WMI][C++][DEV-C++] LECTURES D'INFORMATIONS AVEC WMI SOUS DE...
Source avec Zip [WIN32][C][DEV-C++] AUTO LIST EN HTML
Source avec Zip Source avec une capture [WIN32][C][DEV-C++] GRAPH TRANSPARENT DEBIT RESEAU

 Sources de la même categorie

Source avec Zip Source avec une capture MINI SERVEUR HTTP [WINDOWS] par ganjarasta
Source avec Zip Source avec une capture CLIENT DE TEST MODBUS TCP par brunovan
Source avec Zip Source avec une capture SCANIP [ARP / ICMP] par ganjarasta
Source avec Zip Source avec une capture TRACEROUTE [WINPCAP] par ganjarasta
Source avec Zip SERVEUR MULTITHREAD [LINUX/WIN] par nipepsinicolas

 Sources en rapport avec celle ci

Source avec Zip MINICHAT MULTI-CLIENT par wisar
Source avec Zip COVERT ART IMAGE par nanonavich
Source avec Zip Source avec une capture CLIENT/SERVEUR UTILISANT LES IOCP RÉALISÉ AVEC BORLAND BUILD... par goodboy21
Source avec Zip Source avec une capture LEORACING: JEU DE COURSE MULTIJOUEUR par leo666
Source avec Zip Source avec une capture [WIN32][C][DEV-C++] SNIFF EN RAW SOCKET, AVEC ANNALYSE DES ... par omnia

Commentaires et avis

Commentaire de coucou747 le 30/06/2007 16:49:18 administrateur CS

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

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

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)

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

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 !

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.

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...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,764 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales