Messenger [GTK+ & Socket]

Messenger [GTK+ & Socket] - C - Programmation

Marsh Posté le 10-06-2005 à 11:07:16    

Hello all,
j'ai commencé a programmer un messenger en C avec la bibliothèque GTK+, le problème est que le code ne fonctionne pas (je ne sais pas vraiment a quel niveau), mais il se compile. Je n'arrive pas tellement a vous expliquer mon problème, moi même j'ai du mal a comprendre, ça doit surement venir de code, le voici :
 

Code :
  1. /* Main C file */
  2. #include <stdio.h>                     
  3. #include <gtk/gtk.h>   /* Headers */
  4. #include <winsock2.h>
  5. #include "infos.h"  /* Infos about Alaum product */
  6. #define MAX_RECV 512
  7. #define NO_SENT "Your message has not been sent !"
  8. #define SENT     "Your message has been sent !"
  9. #define PORT_DEFAULT 4666
  10. #define IP_DEFAULT   "127.0.0.1"
  11. #define CONNECTED 0
  12. #define ABORTED   1
  13. /* Prototypes functions */
  14. short socket_create();   // Create 2 socekt (server & client)
  15. void OnEnter_Send(GtkWidget *, gpointer);   /* Callbacks for GTK+ */
  16. void OnClick_Send(GtkWidget *, gpointer);
  17. GtkWidget *pLabel_Mess, *pLabel_StateFriend; 
  18. SOCKADDR_IN server_sockad, client_sockad, friend_sockad;   // sockaddr_in objects declaration
  19. int socket_server, socket_client, friend_socket, friend_size;   // socket description declaration
  20. int main(int argc, char *argv[])
  21. {
  22.      /* Widgets declaration */
  23.      GtkWidget *pTable, *pVBox, *pVBox_Frame,*pWindow; 
  24.      GtkWidget *pExit_Button, *pSend_Button, pRefresh_Button, *pEntry_ToSend, *pFrame;
  25.    
  26.      char buffer_recv[MAX_RECV];
  27.    
  28.      gtk_init(&argc, &argv);  /* GUI (gtk+) creating */
  29.    
  30.      pTable = gtk_table_new(10, 3, TRUE);   // Create table  
  31.    
  32.      pVBox = gtk_vbox_new(TRUE, 0);   /* Create box */
  33.      pVBox_Frame = gtk_vbox_new(TRUE, 0);
  34.      pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);   /* Window initilization */
  35.      gtk_window_set_title(GTK_WINDOW(pWindow), PRODUCT);
  36.      gtk_window_set_default_size(GTK_WINDOW(pWindow), 250, 280);
  37.    
  38.      pExit_Button = gtk_button_new_with_label("Exit" );   /* Create buttons */
  39.      pSend_Button = gtk_button_new_with_label("Send" );
  40.    
  41.      pLabel_Mess = gtk_label_new("Welcome to Alaum !" );
  42.      pLabel_StateFriend = gtk_label_new("" );
  43.    
  44.      pEntry_ToSend = gtk_entry_new();  /* New Entry */
  45.      gtk_entry_set_text(GTK_ENTRY(pEntry_ToSend), SENT);
  46.    
  47.      pFrame = gtk_frame_new("Information" );  /* Create frame */
  48.      gtk_frame_set_shadow_type(GTK_FRAME(pFrame), GTK_SHADOW_OUT);
  49.        
  50.      gtk_box_pack_start(GTK_BOX(pVBox_Frame), pLabel_StateFriend, TRUE, TRUE, 10); 
  51.        
  52.      gtk_box_pack_start(GTK_BOX(pVBox), pFrame, TRUE, FALSE, 0);   // Write frame to wbox
  53.      gtk_container_add(GTK_CONTAINER(pFrame), pVBox_Frame);   // Include vbox_frame to Frame  
  54.          
  55.      /* Attach Widgets at Table */
  56.      gtk_table_attach(GTK_TABLE(pTable), pVBox, 0, 4, 4, 6, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
  57.      gtk_table_attach(GTK_TABLE(pTable), pExit_Button, 3, 4, 9, 10, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
  58.      gtk_table_attach(GTK_TABLE(pTable), pSend_Button, 0, 1, 7, 8, GTK_EXPAND | GTK_FILL, GTK_EXPAND, 0, 0);
  59.      gtk_table_attach(GTK_TABLE(pTable), pEntry_ToSend, 0, 4, 6, 7, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
  60.      gtk_table_attach(GTK_TABLE(pTable), pLabel_Mess, 0, 4, 8, 9, 0, 0, 0, 0);
  61.    
  62.      /* Connect signals at callback functions */
  63.      g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
  64.      g_signal_connect(G_OBJECT(pEntry_ToSend), "activate", G_CALLBACK(OnEnter_Send), pLabel_Mess);
  65.      g_signal_connect(G_OBJECT(pSend_Button), "clicked", G_CALLBACK(OnClick_Send), pTable);
  66.      g_signal_connect(G_OBJECT(pExit_Button), "clicked", G_CALLBACK(gtk_main_quit), NULL);
  67.    
  68.      gtk_container_add(GTK_CONTAINER(pWindow), pTable);   // Add Table to main window
  69.    
  70.      gtk_widget_show_all(pWindow);  /* Start the GUI : finish ! :-) */
  71.      gtk_main();
  72.  
  73.      socket_create();
  74.    
  75.      friend_size = sizeof(friend_sockad);
  76.    
  77.      bind(socket_server, (SOCKADDR *)&server_sockad, sizeof(server_sockad));
  78.      listen(socket_server, 0);     
  79.    
  80.      // Check if friend is connected, if not wait connection
  81.      if(connect(socket_client, (SOCKADDR *)&client_sockad, sizeof(client_sockad)) < 0)   
  82.      {
  83.           MessageBox(0, "Your friend is not connected", "Informtion", MB_ICONINFORMATION);
  84.           friend_socket = accept(socket_server, (SOCKADDR *)&friend_sockad, &friend_size);
  85.      }
  86.    
  87.      send(friend_socket, "Hello !", sizeof("Hello !" ), 0);
  88.      recv(socket_server, buffer_recv, MAX_RECV - 1, 0);
  89.    
  90.      closesocket(socket_server);   /* Closing socket */
  91.      closesocket(friend_socket);
  92.    
  93.      return 0;   /* Alaum's end ;-( */
  94. }
  95. void OnEnter_Send(GtkWidget *pEntry, gpointer Data)
  96. {
  97.      const gchar *pText;   // Text from pEntry  
  98.    
  99.      pText = gtk_entry_get_text(GTK_ENTRY(pEntry));
  100.      
  101.      if(send(friend_socket, pText, sizeof(pText), 0) < 0)   // Try to send pText
  102.      {
  103.           gtk_label_set_text(GTK_LABEL(pLabel_Mess), NO_SENT);  // Modify label's text
  104.           return;               
  105.      }
  106.    
  107.      gtk_label_set_text(GTK_LABEL((GtkWidget *)Data), SENT);   // Modifiy label's text
  108. }
  109. void OnClick_Send(GtkWidget *pButton, gpointer Data)
  110. {
  111.      const gchar* pText;   // Text from pEntry
  112.    
  113.      GtkWidget *pEntry, *pLabel;   // Widget declarations  
  114.      GList *pList = 0;   // List   
  115.      
  116.      pList = gtk_container_get_children(GTK_CONTAINER(Data));  // Get linked list
  117.    
  118.      pList = g_list_next(pList);   // Next element
  119.      pEntry = GTK_WIDGET(pList->data);   // Get Entry Widget
  120.    
  121.      pText = gtk_entry_get_text(GTK_ENTRY(pEntry));   // Get entry's text
  122.    
  123.      send(friend_socket, pText, sizeof(pText), 0);
  124.      g_list_free(pList);   // Free attitude !
  125. }
  126. short socket_create()
  127. {
  128.      int reply;
  129.    
  130.      WSADATA wsaData;   
  131.      reply = WSAStartup(MAKEWORD(2, 0), &wsaData);
  132.    
  133.      /* Add WSAStartup()'s chek here !! */
  134.    
  135.      /* Create socket */
  136.      if((socket_client = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
  137.      {
  138.           MessageBox(0, "Error", "Error while socket creating... aborted !", MB_ICONWARNING); 
  139.           return ABORTED;         
  140.      }
  141.    
  142.      client_sockad.sin_addr.s_addr = inet_addr(IP_DEFAULT);   /* Socket's initialization */
  143.      client_sockad.sin_port = htons(PORT_DEFAULT);
  144.      client_sockad.sin_family = AF_INET;       
  145.          
  146.      /* Create socket */
  147.      if((socket_server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET )   
  148.      {
  149.           MessageBox(0, "Error", "Error while socket creating... aborted !", MB_ICONWARNING);
  150.           return ABORTED;
  151.      }
  152.    
  153.      server_sockad.sin_addr.s_addr = inet_addr(IP_DEFAULT);   /* Socket's initialization */ 
  154.      server_sockad.sin_port = htons(PORT_DEFAULT);
  155.      server_sockad.sin_family = AF_INET;
  156.                
  157.      WSACleanup();
  158.      return CONNECTED;
  159. }


 
Plus exactement, le problème est que la connexion ne se réalise pas entre 2 programmes...
Pouvez-vous m'éclaircir un peu s'il vous plaît ?
Merci

Reply

Marsh Posté le 10-06-2005 à 11:07:16   

Reply

Marsh Posté le 10-06-2005 à 12:56:19    

Bonjour
Je n'en suis pas absolument certain, mais il me semble que toutes les lignes qui sont après gtk_main (); ne seront exécuter que lorsque le programme quittera le gtk.
Le gtk_main est une boucle d'attente d'un évènement.
Il est préférable d'ouvrir la connection réseau avant le gtk_main ()
Dans la fonction OnClick_Send, la manipulation de liste me semble bien inutile vu que tu n'utilise qu'un seul widget autant l'envoyer en paramètre directement au gestionnaire c'est plus léger
     g_signal_connect(G_OBJECT(pSend_Button), "clicked", G_CALLBACK(OnClick_Send), pEntryToSend);  
Je ne suis pas sur que ce gestionnaire fonctionne en l'état car je ne pense pas que le premier enfant de la table soit le gtk_entry vu qu'il est lui même dans une gtk_box.
un petit lien vers un forum spécialisé GTK
http://forums.apinc.org/viewforum.php?f=12
pour les sockets voir les experts sur ce forum.
bon courage

Reply

Marsh Posté le 10-06-2005 à 13:19:09    

Oui, c'est exactement ça, les sockets s'executent en quittant le programme. Je vais essayer ce que t'as dit, merci bicoup :-)

Reply

Marsh Posté le 10-06-2005 à 13:19:56    

PS : gtk_entry n'est pas dans une gtk_box

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed