#include #include #include #include #include #include #include #include #include #include #include #include #include #include #define SERVER_PORT 3333 #define MAX_MSG_SIZE 1024 char msg[MAX_MSG_SIZE]; void PackNewlabel(GtkWidget *box,char *sLabel); void PackNewcombo(GtkWidget *box); GtkWidget* PackNewentry_chat(GtkWidget *box); void PackNewbatton0(GtkWidget *box,char *button_name); void PackNewbatton1(GtkWidget *box,char *button_name); GtkWidget *create_view_and_model (); GtkTreeModel *create_and_fill_model (); void on_changed(GtkWidget *widget, gpointer statusbar) ; void event_close(); //void select_file_activated(GtkWidget *widget); void view_onRowActivated (GtkTreeView *treeview,GtkTreePath *path,GtkTreeViewColumn *col,gpointer userdata); const char* button_event_chat(GtkWidget *widget,gpointer *data); GtkWidget *name_chat; GtkWidget *button1; GtkTreeStore *treestore; GtkTreeIter toplevel, child; void udp_server(void); void udps_respon(int sockfd); void treeclose(GtkWidget *widget,gpointer *data); extern const char* getip(); extern void UIGetUsrInfo(void *arg); extern int UIGetUsrInfo_auto(void *arg); extern int Mysql_newtable (char *a); extern int Mysql_find_p(); extern int Mysql_insert_p(char *friendip); extern void showmsg(char * msg,char*c); extern int clientrecvfile(); //extern int udp_client_logout(); extern int udp_client(char *text,const char *IP) ; GData *widget_chat_dlg; extern struct Widgets_Chat { GtkWidget *chat_dlg; GtkWidget *textview_output, *textview_input; }arg2; void redraw(); void redelete(); enum { LIST_ICON=0,//explain picture LIST_NAME,//explain name COLUMN , // explain text NUM_COLS }; struct argument { char valueip[17]; }arg1; int tree_view() { gdk_threads_enter(); int res; pthread_t b_thread; res=pthread_create(&b_thread,NULL,udp_server,NULL); if(res<0) { printf("pthread create failed"); exit(1); } GtkWidget *window; GtkWidget *box; GtkWidget *view; GtkTreeSelection *selection; GtkWidget *statusbar; window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_signal_connect(GTK_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL); /*登记destroy信号,调用退出函数*/ box=gtk_vbox_new(FALSE,2); PackNewlabel(box,"NO.6_chat_program"); PackNewcombo(box); PackNewlabel(box,"Please Input IP"); PackNewentry_chat(box); PackNewbatton1(box,"add"); gtk_signal_connect(GTK_OBJECT(button1),"pressed",G_CALLBACK(button_event_chat),NULL); gtk_container_add(GTK_CONTAINER(window),box); /*把组装盒放入窗体*/ gtk_widget_set_size_request(window, 250, 400); view = create_view_and_model(); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); gtk_box_pack_start(GTK_BOX(box), view, TRUE, TRUE, 1); PackNewbatton0(box,"set"); statusbar = gtk_statusbar_new(); gtk_box_pack_start(GTK_BOX(box), statusbar, FALSE, TRUE, 1); g_signal_connect(selection, "changed",G_CALLBACK(on_changed), statusbar); g_signal_connect(view, "row-activated", G_CALLBACK(view_onRowActivated), NULL); gtk_widget_show(box); /*使组装盒可视*/ gtk_widget_show_all(window);/*使窗体可见*/ gtk_main(); gdk_threads_leave(); return 1; } void PackNewlabel(GtkWidget *box,char *sLabel) { GtkWidget *label; label=gtk_label_new(sLabel);/*建立标号*/ gtk_box_pack_start(GTK_BOX(box),label,FALSE,FALSE,0); /*把标签控件加入组装盒*/ gtk_widget_show(label); } void PackNewcombo(GtkWidget *box) { GtkWidget *combo; combo=gtk_combo_new(); GList *glist=NULL; glist=g_list_append(glist,"please choose your station"); /*添加字符串到链表*/ glist=g_list_append(glist,"online"); glist=g_list_append(glist,"busy"); glist=g_list_append(glist,"free"); gtk_combo_set_popdown_strings(GTK_COMBO(combo),glist); gtk_box_pack_start(GTK_BOX(box),combo,FALSE,FALSE,0); /*把combo控件加入组装盒*/ gtk_widget_show(combo); } GtkWidget *create_view_and_model () { GtkTreeViewColumn *col; GtkCellRenderer *renderer_text;//explain text GtkCellRenderer *renderer_icon;// explain picture GtkCellRenderer *renderer_name;//explain name GtkWidget *view; GtkTreeModel *model; //这边要不要改成全局变量? view = gtk_tree_view_new(); col = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(col, "YOUR GROUP"); gtk_tree_view_append_column(GTK_TREE_VIEW(view), col); renderer_text=gtk_cell_renderer_text_new();//explain text renderer_icon=gtk_cell_renderer_pixbuf_new();//explain picture renderer_name=gtk_cell_renderer_text_new();//explain name gtk_tree_view_column_pack_start(col,renderer_icon,FALSE);//add picture col gtk_tree_view_column_pack_start(col, renderer_name, TRUE); //add name col gtk_tree_view_column_pack_start(col, renderer_text, TRUE); //add text col gtk_tree_view_column_add_attribute(col,renderer_icon,"pixbuf",LIST_ICON);//add picture to col gtk_tree_view_column_add_attribute(col, renderer_name,"text",LIST_NAME );//add name to col gtk_tree_view_column_add_attribute(col, renderer_text,"text", COLUMN);//add text to col model = create_and_fill_model(); gtk_tree_view_set_model(GTK_TREE_VIEW(view), model); g_object_unref(model); return view; } GtkTreeModel *create_and_fill_model () { GdkPixbuf *pixbuf; const gchar *files[]={"./newface/1.bmp"}; pixbuf = gdk_pixbuf_new_from_file(files[0],NULL); treestore = gtk_tree_store_new(NUM_COLS,GDK_TYPE_PIXBUF,G_TYPE_STRING,G_TYPE_STRING); gtk_tree_store_append(treestore, &toplevel, NULL); gtk_tree_store_set(treestore, &toplevel,COLUMN, "Myself",-1); gtk_tree_store_append(treestore, &child, &toplevel); gtk_tree_store_set(treestore, &child,LIST_ICON,pixbuf,LIST_NAME,"yourself",COLUMN, getip() ,-1); gtk_tree_store_append(treestore, &toplevel, NULL); gtk_tree_store_set(treestore, &toplevel,COLUMN, "YourfFriends",-1); return GTK_TREE_MODEL(treestore); } void on_changed(GtkWidget *widget, gpointer statusbar) { GtkTreeIter iter; GtkTreeModel *model; char *value; if (gtk_tree_selection_get_selected(GTK_TREE_SELECTION(widget),&model,&iter)) { gtk_tree_model_get(model, &iter, COLUMN, &value, -1); gtk_statusbar_push(GTK_STATUSBAR(statusbar), gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar),value), value); g_free(value); } } void PackNewbatton0(GtkWidget *box,char*button_name) { GtkWidget *button; button=gtk_button_new_with_label(button_name); gtk_box_pack_start(GTK_BOX(box),button,FALSE,FALSE,0); /*把按钮加入组装盒*/ gtk_widget_show(button); } void PackNewbatton1(GtkWidget *box,char*button_name) { button1=gtk_button_new_with_label(button_name); gtk_box_pack_start(GTK_BOX(box),button1,FALSE,FALSE,0); /*把按钮加入组装盒*/ gtk_widget_show(button1); } void view_onRowActivated (GtkTreeView *treeview,GtkTreePath *path,GtkTreeViewColumn *col,gpointer userdata) { GtkTreeIter iter; GtkTreeModel *model; char *value;//ip char *value_name; //name pthread_t c_thread[100]; int j=0; int res; model = gtk_tree_view_get_model(treeview); if (gtk_tree_model_get_iter(model, &iter, path)) { gtk_tree_model_get(model, &iter, COLUMN, &value,LIST_NAME, &value_name, -1); if(Mysql_find_p(value)==0) { strcpy(arg1.valueip,value); g_print("chat2%s\n",arg1.valueip); res=pthread_create(&(c_thread[j]),NULL,UIGetUsrInfo_auto,(void *)&arg1); j++; Mysql_newtable (value); Mysql_insert_p(value); if(res<0) { printf("pthread create failed"); exit(1); } g_free(value); g_free(value_name); //pthread_join (c_thread[j], NULL); } } } GtkWidget* PackNewentry_chat(GtkWidget *box) { name_chat=gtk_entry_new();/*创建录入构件*/ gtk_box_pack_start(GTK_BOX(box),name_chat,FALSE,FALSE,5);/*把录入构件加入组合框*/ gtk_widget_show(name_chat);/*显示录入构件*/ return name_chat; } const char* button_event_chat(GtkWidget *widget,gpointer *data) { GdkPixbuf *pixbuf; const gchar *files[]={"./newface/2.bmp"}; pixbuf = gdk_pixbuf_new_from_file(files[0],NULL); const char *uname; uname=(char *)malloc(sizeof(gchar)); uname=gtk_entry_get_text(GTK_ENTRY(name_chat));/*获得录入构件正文*/ gtk_tree_store_append(treestore, &child, &toplevel); gtk_tree_store_set(treestore, &child,LIST_ICON,pixbuf,LIST_NAME,"Yourfriends",COLUMN, uname ,-1); } void udp_server(void) { int sockfd; struct sockaddr_in addr; /* 服务器端开始建立socket描述符 */ sockfd=socket(AF_INET,SOCK_DGRAM,0); if(sockfd<0) { fprintf(stderr,"Socket Error:%s\n",strerror(errno)); exit(1); } /* 服务器端填充 sockaddr结构 */ bzero(&addr,sizeof(struct sockaddr_in)); addr.sin_family=AF_INET; addr.sin_addr.s_addr=htonl(INADDR_ANY); addr.sin_port=htons(SERVER_PORT); /* 捆绑sockfd描述符 */ if(bind(sockfd,(struct sockaddr *)&addr,sizeof(struct sockaddr_in))<0) { fprintf(stderr,"Bind Error:%s\n",strerror(errno)); exit(1); } udps_respon(sockfd); // 进行读写操作 close(sockfd); } void udps_respon(int sockfd) { struct sockaddr_in addr; int addrlen,n; pthread_t d_thread[100]; int j=0; int res; while(1) { /* 从网络上读,并写到网络上 */ bzero(msg,sizeof(msg)); // 初始化,清零 addrlen = sizeof(struct sockaddr); n=recvfrom(sockfd,msg,MAX_MSG_SIZE,0,(struct sockaddr*)&addr,&addrlen); // 从客户端接收消息 /* 显示服务端已经收到了信息 */ printf("Server have received %s\n",msg); char msg_type = msg[0]; switch (msg_type) { case '1': redraw(); char *a=(char*)malloc(sizeof(char)*17); strcpy(a,getip()); g_print("%s",a); a[0]='2'; sleep(2); udp_client(a,(const char *)msg); free(a); break; case '2': msg[0]='1'; redraw(); break; case '9': printf("pareare recv"); clientrecvfile(); break; default: printf("receive c connection from %s\n",inet_ntoa(addr.sin_addr)); char *ip_auto=(char*)malloc(sizeof(char)*17); strcpy(ip_auto,inet_ntoa(addr.sin_addr)); if(Mysql_find_p(inet_ntoa(addr.sin_addr))==0) { struct argument arg; strcpy(arg.valueip,ip_auto); g_print("%s",arg.valueip); res=pthread_create(&(d_thread[j]),NULL,UIGetUsrInfo_auto,(void*)&arg); showmsg(msg,ip_auto); Mysql_newtable (ip_auto); Mysql_insert_p(ip_auto); if(res<0) { printf("pthread create failed"); exit(1); } } else { showmsg(msg,ip_auto); } //free(ip_auto); break; //showmsg(msg,inet_ntoa(addr.sin_addr)); } msg[n]='\0'; // 显示消息 } } void redraw() { GdkPixbuf *pixbuf; const gchar *files[]={"./newface/2.bmp"}; pixbuf = gdk_pixbuf_new_from_file(files[0],NULL); gtk_tree_store_append(treestore, &child, &toplevel); gtk_tree_store_set(treestore, &child,LIST_ICON,pixbuf,LIST_NAME,"Yourfriends",COLUMN, msg,-1); } /*void redelete() { msg[0]='1'; int valid; valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(treestore), &toplevel); gtk_tree_store_append(treestore, &child, &toplevel); while(valid) { gchar *strr; gtk_tree_model_get(GTK_TREE_MODEL(treestore),&child,COLUMN,&strr,-1); if(strcmp(strr , msg) == 0) { gtk_tree_store_remove(GTK_TREE_STORE(treestore), &child); break; } valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(treestore), &child);//先判断是否到结尾 } }*/ /*void treeclose(GtkWidget *widget,gpointer *data) { int res; pthread_t c_thread; res=pthread_create(&c_thread,NULL,udp_client_logout,NULL); if(res<0) { printf("pthread create failed"); exit(1); } gtk_main_quit(); }*/