| 12
 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);
} | 
Partager