psyphi | Bon voila je débute à peine en GTK, j'ai fait une petite application qui retourne l'ip à partir d'un hostname. Voici le code, tout se compile avec qques warning, je pense que j'ai des problèmes de pointeurs, notamment avec char * hostname, mais je n'arrive pas à les corriger. D'autre part j'ai un bug, si on rentre un nom d'host qu'on appuis sur le bouton, qu'on sélectionne le nom d'host et qu'on fait CTRL+C CTRL+V j'ai un popup qui apparait et qui dit: "GLib-ERROR **: gmem.c:174 failed to allocate 32 bytes aborting..." Si vous pourriez m'éclairé la dessus. Sinon si vous avez des remarques dites!
PS: Bien entendu cela nécessite le module GTK+ (dispo ici pour win: /http://www.gtk-fr.org/wakka.php?wiki=Download)
le main.c
Code :
- /*
- * program name : Ggetip v 1.0
- * description : Retourne l'ip à partir d'un nom d'host
- * author : psyphi
- * contact : psyphi@gmail.com
- * last update : August 12 2005
- * compile : gcc -o Ggetip main.c (use -lwsock32 for windows)
- */
- #include <gtk/gtk.h>
- #include <stdlib.h>
- #if defined (WIN32)
- #include <winsock2.h>
- #pragma comment(lib, "ws2_32.lib" )
- #else
- #include <unistd.h>
- #include <sys/socket.h> /* pour avoir AF_INET */
- #include <netinet/in.h> /* pour inet_ntoa() */
- #include <netdb.h> /* pour gethostbyname() & struct hostent */
- #include <sys/types.h>
- #include <arpa/inet.h>
- #endif
- #define INTRO "<span font_family=\"verdana\"><b>Ggetip v 1.0</b> <i>August 2005</i>\nBy: psyphi@gmail.com</span>"
- #define NOTICE "Entrer IP or Hostname:"
- /* Prototypes des fonctions */
- void OnUpdate(GtkWidget *pEntry, gpointer data);
- char * get_ip(struct hostent * host);
- /* Fonction qui retourne l'ip */
- char * get_ip(struct hostent * host)
- {
- return inet_ntoa(*((struct in_addr * )host->h_addr));
- }
- struct _MainWindow
- {
- /*
- * Composants de la fenêtre principale
- */
- GtkWidget * pWindow; // Fenêtre
- GtkWidget * pVBox; // Boite verticale qui va contenir les Labels et boutons
- GtkWidget * pLabelIntro; // Texte d'intro
- GtkWidget * pLabelNotice; // Texte de notice
- GtkWidget * pEntryHost; // Zone de saisie de l'host
- GtkWidget * pButtonScan; // Bouton de scan
- GtkWidget * pLabelInfoHost; // Texte retournant l'ip
- };
- typedef struct _MainWindow MainWindow;
- int main(int argc, char * argv[])
- {
- MainWindow * pApp;
- gtk_init(&argc, &argv);
- pApp = g_malloc(sizeof(MainWindow));
- /*
- * Propriétées de la fenêtre
- */
- pApp->pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); // Création de la fenêtre
- gtk_window_set_position(GTK_WINDOW(pApp->pWindow),GTK_WIN_POS_CENTER); // Définition de la position
- gtk_window_set_default_size(GTK_WINDOW(pApp->pWindow),320,200); // Définition de la taille de la fenetre
- gtk_window_set_title(GTK_WINDOW(pApp->pWindow),"Ggetip" ); // Titre de la fenêtre
- /*
- * Propriétées de la VBox
- */
- pApp->pVBox = gtk_vbox_new(TRUE, 0); // Création de la VBox
- gtk_container_add(GTK_CONTAINER(pApp->pWindow),pApp->pVBox); // Ajout de la GtkVBox dans la fenêtre
- /*
- * Propriétées du label d'intro
- */
- pApp->pLabelIntro=gtk_label_new(INTRO);
- gtk_label_set_use_markup(pApp->pLabelIntro,TRUE); // On utilise les balises de formatage Pango
- gtk_box_pack_start(GTK_BOX(pApp->pVBox),pApp->pLabelIntro,FALSE,FALSE,0); // On ajoute le label a l'interieur de la VBox
- /*
- * Propriétées du label de notice
- */
- pApp->pLabelNotice=gtk_label_new(NOTICE);
- gtk_box_pack_start(GTK_BOX(pApp->pVBox),pApp->pLabelNotice,FALSE,FALSE,0);
- /*
- * Propriétées de la zone de saisie de l'host
- */
- pApp->pEntryHost=gtk_entry_new(); // On crée la zone de saisie
- gtk_box_pack_start(GTK_BOX(pApp->pVBox),pApp->pEntryHost,FALSE,FALSE,0); // On l'attache à la VBox
- g_signal_connect(G_OBJECT(pApp->pEntryHost),"activate",G_CALLBACK(OnUpdate),(gpointer) pApp); // Connexion du signal "activate"
- /*
- * Propriétées du bouton de scan
- */
- pApp->pButtonScan=gtk_button_new_with_label("Get IP !" );
- gtk_box_pack_start(GTK_BOX(pApp->pVBox),pApp->pButtonScan,FALSE,FALSE,0);
- g_signal_connect(G_OBJECT(pApp->pButtonScan),"clicked",G_CALLBACK(OnUpdate),(gpointer*) pApp);
- /*
- * Propriétées de la zone d'affichage IP
- */
- pApp->pLabelInfoHost=gtk_label_new(NULL);
- gtk_box_pack_start(GTK_BOX(pApp->pVBox),pApp->pLabelInfoHost,FALSE,FALSE,0);
- /* Connexion du signal "destroy" */
- g_signal_connect(G_OBJECT(pApp->pWindow),"destroy",G_CALLBACK(gtk_main_quit),NULL);
-
- gtk_widget_show_all(pApp->pWindow); // Affichage de la fenêtre
- /* Demarrage de la boucle evenementielle */
- gtk_main();
- g_free(pApp);
- return EXIT_SUCCESS;
- }
- /* Fonction callback execute lors du signal "activate" */
- void OnUpdate(GtkWidget *pEntry, gpointer data)
- {
- #if defined(WIN32)
- WSADATA WSAData;
- WSAStartup(MAKEWORD(2,0), &WSAData);
- #endif
- char * hostname;
- struct hostent * host;
- MainWindow * pApp;
-
- /* Recuperation de data */
- pApp = (MainWindow*) data;
- /* Recuperation du texte */
- hostname=gtk_entry_get_text(GTK_ENTRY(pApp->pEntryHost));
- if(strcmp(hostname,"" ))
- {
- host=gethostbyname(hostname);
- if(!host)
- {
- hostname="Can't find host !";
- }
- else
- {
- strncat(hostname,"\nIP: ",5);
- strcat(hostname,get_ip(host));
- }
- }
- else
- hostname="Please enter hostname !";
- /* Affichage de l'Host */
- gtk_label_set_text(GTK_LABEL(pApp->pLabelInfoHost),hostname);
- free(hostname);
- #if defined(WIN32)
- WSACleanup();
- #endif
- }
|
|