1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
| /*
Saisir une URL ou une IP dans la zone de texte,
presser Entrée: un socket se connecte et récupère
l'en-tête HTTP du serveur avec une requête HEAD.
Lunixinclar.
*/
#include <gtk/gtk.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <arpa/inet.h>
GtkWidget *TxtData;
static void TxtIP_ENTER_Pressed(GtkWidget *widget, GtkWidget *entry);
/*******************************************************************************
Point d'entrée
******************************************************************************/
int main(int argc, char **argv)
{
GtkWidget *Fen, *vbox, *TxtIP;
gtk_init(&argc, &argv);
// Fenêtre
Fen = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect(G_OBJECT(Fen),"destroy",G_CALLBACK(gtk_main_quit),NULL);
gtk_container_set_border_width (GTK_CONTAINER (Fen), 4);
gtk_window_set_default_size(GTK_WINDOW(Fen), 400, 400);
gtk_window_set_position (GTK_WINDOW (Fen), GTK_WIN_POS_CENTER);
vbox = gtk_vbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (Fen), vbox);
gtk_widget_show (vbox);
// Textbox IP/serveur
TxtIP = gtk_entry_new ();
gtk_entry_set_max_length (GTK_ENTRY (TxtIP), 50);
g_signal_connect (G_OBJECT (TxtIP), "activate",
G_CALLBACK(TxtIP_ENTER_Pressed),(gpointer)TxtIP);
gtk_entry_set_text (GTK_ENTRY (TxtIP), "127.0.0.1");
gtk_editable_select_region (GTK_EDITABLE (TxtIP),0,
GTK_ENTRY (TxtIP)->text_length);
gtk_box_pack_start (GTK_BOX (vbox), TxtIP, FALSE, TRUE, 0);
// Textbox messages
TxtData = gtk_text_view_new();
gtk_box_pack_start (GTK_BOX (vbox), TxtData, TRUE, TRUE, 4);
gtk_widget_show_all(Fen);
gtk_main();
return 0;
}
/*******************************************************************************
* Presser Entrée pour se connecter
******************************************************************************/
static void TxtIP_ENTER_Pressed(GtkWidget *widget, GtkWidget *entry)
{
int sk = -1; // descripteur socket
struct sockaddr_in ServAddr; // addresse du serveur
struct hostent *serveurEnt; // description serveur
unsigned long hostAddr; // addr du serveur
int i=1;
const gchar *serveur = NULL; // www.truc.com ou IP
const gchar *req = NULL; // Requête HTTP
const gchar *sUTF8 = NULL; // Paquet réponse en UTF8
char buf[2048]; // en locale
GtkTextBuffer *pTx;
GtkTextIter iStart;
serveur = gtk_entry_get_text (GTK_ENTRY(entry));
pTx = gtk_text_view_get_buffer(GTK_TEXT_VIEW(TxtData));
gtk_text_buffer_get_start_iter(pTx, &iStart);
sUTF8 = g_strdup_printf("[Connection à %s] ", serveur);
gtk_text_buffer_insert (pTx, &iStart, sUTF8, -1);
bzero(&ServAddr,sizeof(ServAddr));
hostAddr = inet_addr(serveur); // convertit IP en entier long
if ( (long)hostAddr != (long)-1)
bcopy(&hostAddr, &ServAddr.sin_addr, sizeof(hostAddr));
else // un nom a été donné, pas une IP
{
serveurEnt = gethostbyname(serveur);
if (serveurEnt==NULL)
{
gtk_text_buffer_insert(pTx,&iStart,"> gethostbyname = NULL\n\n",-1);
return;
}
bcopy(serveurEnt->h_addr,&ServAddr.sin_addr, serveurEnt->h_length);
}
ServAddr.sin_port = htons(80); // Port 80 pour HTTP
ServAddr.sin_family = AF_INET;
if ( (sk = socket(AF_INET,SOCK_STREAM,0)) < 0)
{
gtk_text_buffer_insert(pTx, &iStart,"> Problème création socket.\n\n",-1);
return;
}
if (connect(sk,(struct sockaddr *)&ServAddr, sizeof(ServAddr)) < 0)
{
gtk_text_buffer_insert (pTx, &iStart, "> Problème sur connect().\n\n", -1);
return;
}
sUTF8 = g_strdup_printf("(%s)\n", inet_ntoa(ServAddr.sin_addr));
gtk_text_buffer_insert (pTx, &iStart, sUTF8, -1);
req = g_strdup_printf("HEAD / HTTP/1.1\r\n"
"Host:%s\r\n\r\n", serveur);
i = send(sk, req, strlen(req), 0);
i = recv(sk, buf, sizeof(buf), 0);
if (i)
{
buf[i]=0;
sUTF8 = g_locale_to_utf8(buf,i,NULL,NULL,NULL);
gtk_text_buffer_insert (pTx, &iStart, sUTF8, -1);
}
close(sk);
gtk_text_buffer_insert (pTx, &iStart, g_strdup("> Socket fermé.\n"), -1);
} |