# Include # define OUTPORT 3333 gint sd; struct sockaddr_in s_in; struct hostent * host; gchar username [64]; gchar buf [1024]; // readgchar get_buf [1048]; // writegboolean isconnected = FALSE; static GtkWidget * text; static GtkTextBuffer * buffer; static GtkWidget * message_entry; static GtkWidget * name_entry; static GtkWidget * login_button; void get _ Message (void) {GtkTextIter iter; gchar get_buf [1024]; gchar buf [1024]; while (read (sd, buf, 1024 )! =-1) {sprintf (get_buf, "% s", buf); gdk_threads_enter (); gtk_text_buffer_get_end_iter (buffer, & iter); gtk_text_buffer_insert (buffer, & iter, get_buf, -1); gdk_threads_leave () ;}} void on_destroy (GtkWidget * widget, GdkEvent * event, gpointer data) {sprintf (username, "guest"); if (do_connect () = TRUE) {gtk_widget_set_sensitive (login_button, FALSE); g_thread_create (GThreadFunc) get_message, NULL, FALSE, NULL);} gtk_widget_destroy (Widget);} void on_button_clicked (GtkButton * button, gpointer data) {const gchar * name; name = gtk_entry_get_text (GTK_ENTRY (name_entry); sprintf (username, "% s ", name); if (do_connect () {gtk_widget_set_sensitive (login_button, FALSE); g_thread_create (GThreadFunc) get_message, NULL, FALSE, NULL);} gtk_widget_destroy (data );} void creat_win (void) {GtkWidget * win, * vbox; GtkWidget * button; win = gtk_window_new (GTK_WINDOW_TOPLE VEL); gtk_window_set_title (GTK_WINDOW (win), "input username"); gtk_container_set_border_width (GTK_CONTAINER (win), 10); g_signal_connect (G_OBJECT (win), "delete_event ", g_CALLBACK (on_destroy), NULL); Round (GTK_WINDOW (win), TRUE); gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER); vbox = gtk_vbox_new (FALSE, 0 ); gtk_container_add (GTK_CONTAINER (win), vbox); name_entry = gtk_entry_new (); gtk_box_pack_start (GTK_BOX (vbox), name_entry, TRUE, TRUE, 5); button = invoke (GTK_STOCK_ OK); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (on_button_clicked), win ); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 5); gtk_widget_show_all (win);} gboolean do_connect (void) {GtkTextIter iter; gint slen; sd = socket (AF_INET, SOCK_STREAM, 0); if (sd <0) {gtk_text_buffer_get_end_iter (buffer, & iter); gtk_text_buffer_ I Nsert (buffer, & iter, "An error occurred while opening the socket! ",-1); return FALSE;} s_in.sin_family = AF_INET; s_in.sin_port = htons (OUTPORT); s_in.sin_addr = * (struct in_addr *) host-> h_addr ); bzero (& (s_in.sin_zero), 8); slen = sizeof (s_in); if (connect (sd, (struct sockaddr *) & s_in, slen) <0) {gtk_text_buffer_get_end_iter (buffer, & iter); gtk_text_buffer_insert (buffer, & iter, "An error occurred while connecting to the server! ",-1); return FALSE;} else {gtk_text_buffer_get_end_iter (buffer, & iter); gtk_text_buffer_insert (buffer, & iter, username,-1); gtk_text_buffer_get_end_iter (buffer, & iter); gtk_text_buffer_insert (buffer, & iter, "successfully connected to the server! ",-1); // write (sd, username, 64); // isconnected = TRUE; return TRUE ;}} void on_send (GtkButton * button, gpointer data) {const char * message; if (isconnected = FALSE) return; message = gtk_entry_get_text (GTK_ENTRY (message_entry); sprintf (buf, "% s", message ); write (sd, buf, 1024); gtk_entry_set_text (GTK_ENTRY (message_entry), "");} void on_login (GtkWidget * widget, GdkEvent * weent, gpointer data) {creat_win ();} void on_delete_even T (GtkWidget * widget, GdkEvent * event, gpointer data) {close (sd); gtk_main_quit () ;} int main (int argc, char * argv []) {GtkWidget * window; GtkWidget * vbox, * hbox, * button, * label, * view; if (! G_thread_supported () g_thread_init (NULL); gtk_init (& argc, & argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "client "); g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (on_delete_event), NULL); Evaluate (GTK_CONTAINER (window), 10); vbox = gtk_vbox_new (FALSE, 0 ); gtk_container_add (GTK_CONTAINER (window), vbox); hbox = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5 ); label = gtk_label_new ("click the login button to connect to the server"); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 5); login_button = gtk_button_new_with_label ("login "); gtk_box_pack_start (GTK_BOX (hbox), login_button, FALSE, FALSE, 5); g_signal_connect (G_OBJECT (login_button), "clicked", G_CALLBACK (on_login), NULL ); view = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_se
|