分布式应用 GTK+Mysql+socket 简易图书馆查询系统
来源:互联网 发布:js获取时间差毫秒 编辑:程序博客网 时间:2024/05/16 18:52
这是我的分布式计算环境作业,用到的GTK,Mysql,socket都是第一次使用,边学边用,大概用了十天的时间编写完的,大部分时间还是上课...
程序还有N多Bug,没时间调了,姑且就先这样,反正作业要求的都实现了,...*^_^*…
中间还有几个比较笨的地方,比如客户端对从服务器接收来的信息进行分析拆解时,我只是假设最多只有两条记录,当然这是不可能的,但3条以上的记录时,通过罗列sscan()中的格式串也能实现,不过觉得肯定不能这样实现,太原始了,现在只是有个初始的改进想法,时间不多了,就先放着了...
操作系统使用的是Ubuntu8.04...
程序还有N多Bug,没时间调了,姑且就先这样,反正作业要求的都实现了,...*^_^*…
中间还有几个比较笨的地方,比如客户端对从服务器接收来的信息进行分析拆解时,我只是假设最多只有两条记录,当然这是不可能的,但3条以上的记录时,通过罗列sscan()中的格式串也能实现,不过觉得肯定不能这样实现,太原始了,现在只是有个初始的改进想法,时间不多了,就先放着了...
操作系统使用的是Ubuntu8.04...
- /*简易图书馆查询系统客户端*/
- /*编译命令 gcc -o lib_app lib_app.c `pkg-config --libs --cflags gtk+-2.0`*/
- #include<gtk/gtk.h>
- #include<sys/types.h>
- #include<sys/socket.h>
- #include<netinet/in.h>
- #include<arpa/inet.h>
- #include<netdb.h>
- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- #include<arpa/inet.h>
- #define DEF_PORT 5188 /*默认的连接端口号*/
- #define MAXSIZE 2000 /*默认每次传输的最大字节数*/
- extern int errno;
- enum { LIST_ITEM=0,N_COLUMNS};
- GtkWidget *input_text; /*用户查询输入框*/
- GtkWidget *list; /*显示查询结果列表框*/
- int list_is_click=0; /*判断list是否被选择*/
- char book_name[5][40];
- char author[5][40];
- char public_addr[5][40];
- char public_time[5][40];
- char abstract[5][500];
- char catalog[5][1000];
- void on_list_changed();
- char *selected_book_name; //返回类表框中用户选择的书籍名称
- int book_display_flag; //判断要显示那本书的详细信息
- /*initializing the list widget*/
- static void init_list(GtkWidget *list)
- {
- GtkListStore *store;
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *column;
- renderer=gtk_cell_renderer_text_new();
- column=gtk_tree_view_column_new_with_attributes("List Items",renderer,"text",LIST_ITEM,NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(list),column);
- store=gtk_list_store_new(N_COLUMNS,G_TYPE_STRING);
- gtk_tree_view_set_model(GTK_TREE_VIEW(list),GTK_TREE_MODEL(store));
- g_object_unref(store);
- }
- /*add item to the list */
- static void add_to_list(GtkWidget *list,const gchar *str)
- {
- GtkListStore *store;
- GtkTreeIter iter;
- store=GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(list)));
- gtk_list_store_append(store,&iter);
- gtk_list_store_set(store,&iter,LIST_ITEM,str,-1);
- }
- /*清除列表框中的项目*/
- static void remove_all(GtkWidget *widget, gpointer selection)
- {
- GtkListStore *store;
- GtkTreeModel *model;
- GtkTreeIter iter;
- store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW (list)));
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (list));
- if (gtk_tree_model_get_iter_first(model, &iter) == FALSE)
- return;
- gtk_list_store_clear(store);
- }
- /*用户单击OK按钮时显示选取的书籍名称*/
- void show_info(GtkWidget *widget,gpointer window)
- {
- GtkWidget *dialog;
- dialog=gtk_message_dialog_new(window, GTK_DIALOG_DESTROY_WITH_PARENT,GTK_MESSAGE_INFO,GTK_BUTTONS_OK,selected_book_name,"title");
- gtk_window_set_title(GTK_WINDOW(dialog),"返回信息");
- gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy(dialog);
- }
- void help_info(GtkWidget *widget,gpointer window)
- {
- GtkWidget *dialog;
- char help_info[100]="本简易图书馆查询系统中共有5本书:排队论,/nc程序设计教程,C语言程序设计入门,英语听说教程,Ubuntu Linux 入门到精通/n";
- dialog=gtk_message_dialog_new(window, GTK_DIALOG_DESTROY_WITH_PARENT,GTK_MESSAGE_INFO,GTK_BUTTONS_OK,help_info,"title");
- gtk_window_set_title(GTK_WINDOW(dialog),"帮助信息");
- gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy(dialog);
- }
- /*帮助信息*/
- /*改变窗口图标*/
- GdkPixbuf *create_icon(const gchar *icon_name)
- {
- GdkPixbuf *icon;
- GError *error=NULL;
- icon=gdk_pixbuf_new_from_file(icon_name,&error);
- if(!icon)
- {
- fprintf(stderr,"%s/n",error->message);
- g_error_free(error);
- }
- return icon;
- }
- /*当用户点击查询按钮后将开始与服务器端进行连接*/
- void button_search_click()
- {
- struct hostent *ptrhost; /*指向主机列表中的一个条目的指针*/
- struct sockaddr_in server_addr; /*存档服务器端网络地址的结构 */
- int socket_describe; /*客户端套接字描述符*/
- int port; /*服务器端套接字协议端口号*/
- int receive_num; /*客户端接收到的字节数*/
- char *host="localhost"; /*服务器主机名称指针*/
- char receive_buf[MAXSIZE]; /*接收服务器发送过来的数据缓冲区*/
- char send_buf[100]; /*向服务器发送用户的查询信息缓冲区*/
- int connect_flag;
- char *search_book; /*存储用户的查询输入*/
- char send_flag;
- GtkTreeSelection *selection;
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list));
- remove_all(list,selection);
- bzero(search_book,sizeof(search_book));
- search_book=(char *)gtk_entry_get_text((GtkEntry *)input_text);
- bzero(send_buf,sizeof(send_buf));
- memset(receive_buf,0,sizeof(receive_buf));
- memcpy(send_buf,search_book,strlen(search_book));
- printf("你要查询的书籍是: %s/n",send_buf);
- memset((char*)&server_addr,0,sizeof(server_addr));
- server_addr.sin_family=AF_INET;
- port=DEF_PORT;
- server_addr.sin_port=htons((u_short)port);
- ptrhost=gethostbyname(host);
- if((char *)ptrhost==NULL)
- {
- fprintf(stderr,"invalid host %s",host);
- exit(1);
- }
- memcpy(&server_addr.sin_addr,ptrhost->h_addr,ptrhost->h_length);
- /*创建套接字*/
- socket_describe=socket(AF_INET,SOCK_STREAM,0);
- if(socket_describe<0)
- {
- fprintf(stderr,"socket create failed/n");
- exit(1);
- }
- printf("create socket successfully/n");
- /*请求连接到服务器*/
- connect_flag=connect(socket_describe,(struct sockaddr *)&server_addr,sizeof(server_addr));
- if(connect_flag<0)
- {
- fprintf(stderr,"connect failed");
- exit(1);
- }
- printf("connect successfully/n");
- send_flag=send(socket_describe,send_buf,strlen(send_buf),0);
- printf("client send size is: %d/n",send_flag);
- printf("client send message is :%s/n",send_buf);
- bzero(send_buf,sizeof(send_buf));
- receive_num=recv(socket_describe,receive_buf,sizeof(receive_buf),0);
- printf("client receive_num is :%d/n",receive_num);
- while(receive_num>0)
- {
- receive_num=recv(socket_describe,receive_buf,sizeof(receive_buf),0);
- }
- printf("client receive message is :%s/n",receive_buf);
- /*把从服务器接收到的数据进行提取如book_name,author,public_addr等信息,利用强大的函数sscaf()*^_^*暂时现利用各比较理想的方法--列举法,假设知道返回的书籍不会多余5本,以后有时间在改进下,暂时还想不出什么比较好的方法,时间不多了*/
- if(receive_buf=="NULL")
- {
- add_to_list(list,"没有你所要查找的书籍");
- }
- else
- {
- char multi_flag[50]; //通过sscaf()函数从receive_buf中提取出每条记录之间的分隔符$之后的一个字符,如果这个字符不为空,表示还有信息,如果为空,表示没有了
- bzero(multi_flag,sizeof(multi_flag));
- sscanf(receive_buf,"%*[^$]$%[^#]",multi_flag);
- printf("multi_flag is :%s/n",multi_flag);
- printf("size of multi_flag is %d/n",strlen(multi_flag));
- /*如果返回结果只有一本书*/
- if(multi_flag==NULL||strlen(multi_flag)==0)
- {
- sscanf(receive_buf,"%[^#]#%[^#]#%[^#]#%[^#]#%[^#]#%[^#]#",book_name[0],author[0],public_addr[0],public_time[0],abstract[0],catalog[0]);
- printf("book name is %s/n",book_name[0]);
- if(book_name=="NULL")
- {
- add_to_list(list,"没有你所要查找的书籍");
- }
- else
- {
- add_to_list(list,book_name[0]);
- }
- }
- /*返回结果有多本书*/
- else
- {
- sscanf(receive_buf,"%[^#]#%[^#]#%[^#]#%[^#]#%[^#]#%[^#$]#$%[^#]#%[^#]#%[^#]#%[^#]#%[^#]#%[^#$]#$",book_name[0],author[0],public_addr[0],public_time[0],abstract[0],catalog[0],book_name[1],author[1],public_addr[1],public_time[1],abstract[1],catalog[1]);
- init_list(list);
- add_to_list(list,book_name[0]);
- add_to_list(list,book_name[1]);
- }
- }
- }
- void destroy(GtkWidget *widget, gpointer *data)
- {
- gtk_widget_destroy(GTK_WIDGET(data));
- /*bzero(author,sizeof(author));
- bzero(public_addr,sizeof(public_addr));
- bzero(public_time,sizeof(public_time));
- bzero(abstract,sizeof(abstract));
- bzero(catalog,sizeof(catalog));*/
- }
- /*当用户点击button_detail按钮时触发此函数*/
- void button_detail_click()
- {
- GtkWidget *button;
- GtkWidget *dialog;
- GtkWidget *vbox_d;
- GtkWidget *hbox1_d;
- GtkWidget *hbox2_d;
- GtkWidget *hbox3_d;
- GtkWidget *hbox4_d;
- GtkWidget *hbox5_d;
- GtkWidget *fixed;
- GtkWidget *label0,*label1,*label2,*label3,*label4,*label5,*label6,*label7,*label8,*label9;
- GtkWidget *halign1;
- GtkWidget *halign2;
- GtkWidget *halign3;
- GtkWidget *halign4;
- GtkWidget *halign5;
- int choosed; //判断该显示那本书的详细信息
- if(!strcmp(selected_book_name,book_name[0]))
- choosed=0;
- if(!strcmp(selected_book_name,book_name[1]))
- choosed=1;
- dialog=gtk_dialog_new( );
- halign1=gtk_alignment_new(0,0,0,0);
- vbox_d=gtk_vbox_new(FALSE,5);
- hbox1_d=gtk_hbox_new(FALSE,5);
- label0 = gtk_label_new ("作者:");
- gtk_container_add(GTK_CONTAINER(hbox1_d), label0);
- label1= gtk_label_new (NULL);
- gtk_label_set_text(label1,author[choosed]);
- gtk_container_add(GTK_CONTAINER(hbox1_d), label1);
- gtk_container_add(GTK_CONTAINER(halign1), hbox1_d);
- gtk_container_add(GTK_CONTAINER(vbox_d), halign1);
- halign2=gtk_alignment_new(0,0,0,0);
- hbox2_d=gtk_hbox_new(FALSE,5);
- label2 = gtk_label_new ("出版社:");
- gtk_container_add(GTK_CONTAINER(hbox2_d), label2);
- label3= gtk_label_new (NULL);
- gtk_label_set_text(label3,public_addr[choosed]);
- gtk_container_add(GTK_CONTAINER(hbox2_d), label3);
- gtk_container_add(GTK_CONTAINER(halign2), hbox2_d);
- gtk_container_add(GTK_CONTAINER(vbox_d), halign2);
- halign3=gtk_alignment_new(0,0,0,0);
- hbox3_d=gtk_hbox_new(FALSE,5);
- label4 = gtk_label_new ("出版时间:");
- gtk_container_add(GTK_CONTAINER(hbox3_d), label4);
- label5= gtk_label_new (NULL);
- gtk_label_set_text(label5, public_time[choosed]);
- gtk_container_add(GTK_CONTAINER(hbox3_d), label5);
- gtk_container_add(GTK_CONTAINER(halign3), hbox3_d);
- gtk_container_add(GTK_CONTAINER(vbox_d), halign3);
- halign4=gtk_alignment_new(0,0,0,0);
- hbox4_d=gtk_hbox_new(FALSE,5);
- label6 = gtk_label_new ("内容简介:");
- gtk_container_add(GTK_CONTAINER(hbox4_d), label6);
- label7= gtk_label_new (NULL);
- gtk_label_set_text(label7,abstract[choosed]);
- gtk_container_add(GTK_CONTAINER(hbox4_d), label7);
- gtk_container_add(GTK_CONTAINER(halign4), hbox4_d);
- gtk_container_add(GTK_CONTAINER(vbox_d), halign4);
- halign5=gtk_alignment_new(0,0,0,0);
- hbox5_d=gtk_hbox_new(FALSE,5);
- label8 = gtk_label_new ("章节目录:");
- gtk_container_add(GTK_CONTAINER(hbox5_d), label8);
- label9= gtk_label_new (NULL);
- gtk_label_set_text(label9,catalog[choosed]);
- gtk_container_add(GTK_CONTAINER(hbox5_d), label9);
- gtk_container_add(GTK_CONTAINER(halign5), hbox5_d);
- gtk_container_add(GTK_CONTAINER(vbox_d), halign5);
- fixed=gtk_fixed_new();
- button=gtk_button_new_with_label("Yes");
- gtk_widget_set_size_request (button, 100, 40);
- gtk_fixed_put(GTK_FIXED(fixed),button,220,50);
- gtk_container_add(GTK_CONTAINER(vbox_d),fixed);
- gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area),vbox_d,TRUE,TRUE,0);
- g_signal_connect(GTK_OBJECT(button),"clicked",G_CALLBACK(destroy),dialog);
- gtk_widget_show_all(dialog);
- }
- void on_list_changed(GtkWidget *widget)
- {
- GtkTreeIter iter;
- GtkTreeModel *model;
- list_is_click=1;
- if(gtk_tree_selection_get_selected(GTK_TREE_SELECTION(widget),&model,&iter))
- {
- gtk_tree_model_get(model,&iter,LIST_ITEM,&selected_book_name,-1);
- printf("choosed book name is :%s/n",selected_book_name);
- }
- }
- int main(int argc,char *argv[])
- {
- GtkWidget *window;
- GtkWidget *label1;
- GtkWidget *table;
- GtkWidget *button_help,*button_ok;
- GtkWidget *button_search;
- GtkWidget *button_detail;
- GtkWidget *halign1;
- /*初始化*/
- gtk_init(&argc,&argv);
- /*创建窗口window*/
- window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
- gtk_window_set_title(GTK_WINDOW(window),"简易图书馆查询系统");
- gtk_widget_set_size_request(window,300,300);
- gtk_window_set_icon(GTK_WINDOW(window),create_icon("icon.gif"));
- /*创建Table控件*/
- table=gtk_table_new(6,4,TRUE);
- gtk_container_add(GTK_CONTAINER(window),table);
- /*创建用户查询输入框input_text*/
- input_text=gtk_entry_new();
- gtk_table_attach(GTK_TABLE(table),input_text,0,3,0,1,GTK_FILL|GTK_SHRINK,GTK_FILL|GTK_SHRINK,5,5);
- /*创建查询按钮button_search*/
- button_search=gtk_button_new_with_label("Search");
- gtk_widget_set_size_request(button_search,60,30);
- gtk_table_attach(GTK_TABLE(table),button_search,3,4,0,1,GTK_FILL|GTK_SHRINK,GTK_FILL|GTK_SHRINK,5,5);
- /*创建查询结果提示label1*/
- halign1=gtk_alignment_new(0,0,0,0);
- label1=gtk_label_new("Search Results:");
- gtk_container_add(GTK_CONTAINER(halign1),label1);
- gtk_table_attach(GTK_TABLE(table),halign1,0,2,1,2,GTK_FILL|GTK_SHRINK,GTK_FILL|GTK_SHRINK,5,5);
- /*create and initializing the list view*/
- list=gtk_tree_view_new();
- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(list),FALSE);
- gtk_table_attach(GTK_TABLE(table),list,0,3,2,5,GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND,5,5);
- //init_list(list);
- /*cteate button_detail*/
- button_detail=gtk_button_new_with_label("Detail");
- gtk_table_attach(GTK_TABLE(table),button_detail,3,4,2,3,GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND,5,5);
- /*create button_help*/
- button_help=gtk_button_new_with_label("Help");
- gtk_table_attach(GTK_TABLE(table),button_help,0,1,5,6,GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND,5,5);
- /*create button_ok*/
- button_ok=gtk_button_new_with_label("Ok");
- gtk_table_attach(GTK_TABLE(table),button_ok,3,4,5,6,GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND,5,5);
- /*显示窗口及所有控件*/
- gtk_widget_show_all(window);
- g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
- g_signal_connect(G_OBJECT(button_search),"clicked",G_CALLBACK(button_search_click),NULL);
- g_signal_connect(G_OBJECT(button_detail),"clicked",G_CALLBACK(button_detail_click),NULL);
- g_signal_connect(gtk_tree_view_get_selection(GTK_TREE_VIEW(list)),"changed",G_CALLBACK(on_list_changed),NULL);
- g_signal_connect(G_OBJECT(button_ok), "clicked", G_CALLBACK(show_info), (gpointer) window);
- g_signal_connect(G_OBJECT(button_help), "clicked", G_CALLBACK(help_info), (gpointer) window);
- //update_widget_bg(GTK_WIDGET(window), "background.jpg");
- gtk_main();
- return 0;
- }
- /*简易图书查询系统服务器端*/
- //////////////////server////////////////////////////
- /*编译时使用语句gcc -o lib_app_server lib_app_server.c `pkg-config --libs --cflags gtk+-2.0` `mysql_config --cflags --libs`*/
- #include<gtk/gtk.h>
- #include<sys/types.h>
- #include<sys/socket.h>
- #include<netinet/in.h>
- #include<netdb.h>
- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- #include<arpa/inet.h>
- #include"/usr/include/mysql/mysql.h"
- #include<unistd.h>
- #define DEF_PORT 5188
- #define MAXLINK 10
- /*mysql_connect()函数定义,连接mysql数据库并根据用户的输入查询相关的结果*/
- char* mysql_connect(char *str)
- {
- char *search_str;
- MYSQL mysql_connection;
- MYSQL_RES *res_ptr;
- MYSQL_ROW sqlrow;
- int res;
- int result_rows; //查询结果的行数;
- MYSQL_FIELD *fields;
- char *result_str;
- //bzero(search_str,sizeof(search_str));
- sprintf(search_str,"select * from library where book_name regexp '%s'",str);
- printf("search_str is :%s/n",search_str);
- //bzero(result_str,sizeof(result_str));
- result_str=(char *)malloc(sizeof(char)*1500);
- /*初始化并进行连接*/
- mysql_init(&mysql_connection);
- if(mysql_real_connect(&mysql_connection,"localhost","root","********","bookstore",0,NULL,CLIENT_FOUND_ROWS))
- {
- printf(" Mysql connected successfully/n");
- res=mysql_query(&mysql_connection,search_str);
- printf("search_str is :%s/n",search_str);
- if(res)
- {
- printf("select error:%s/n",mysql_error(&mysql_connection));//43
- }
- else
- {
- res_ptr=mysql_store_result(&mysql_connection);
- if(res_ptr) //有查询结果时
- {
- result_rows=mysql_num_rows(res_ptr);
- /*如果查询的结果只有一条记录*/
- if(result_rows==1)
- {
- sqlrow=mysql_fetch_row(res_ptr);
- bzero(result_str,sizeof(result_str));
- printf("book_name is :%s/n",sqlrow[0]);
- printf("author is :%s/n",sqlrow[1]);
- printf("public_addr is :%s/n",sqlrow[2]);
- printf("public_time is :%s/n",sqlrow[3]);
- printf("abstract is :%s/n",sqlrow[4]);
- printf("catalog is :%s/n",sqlrow[5]);
- //sprintf(result_str,"%s%s%s%s%s%s/n",sqlrow[0],sqlrow[1],sqlrow[2],sqlrow[3],sqlrow[4],sqlrow[5]);
- int i=0;
- for(i=0;i<6;i++)
- {
- strcat(result_str,sqlrow[i]);
- strcat(result_str,"#"); //插入每列之间的间隔标签"#",以便客户端分析接收到的数据
- }
- strcat(result_str,"$#");
- printf("result_str is :%s/n",result_str);
- }
- /*如果查询记录多于一条*/
- else if(result_rows>1)
- {
- char temp_str[1000];
- bzero(result_str,sizeof(result_str));
- printf("result rows is: %d/n",result_rows);
- //sqlrow=mysql_fetch_row(res_ptr);
- while(sqlrow=mysql_fetch_row(res_ptr))
- {
- int tmp=0;
- for(tmp=0;tmp<6;tmp++)
- {
- strcat(temp_str,sqlrow[tmp]);
- strcat(temp_str,"#"); //一条记录中各列之间的间隔标签"#"
- }
- strcat(result_str,temp_str);
- bzero(temp_str,sizeof(temp_str));
- printf("multi rows result is:%s/n",result_str);
- strcat(result_str,"$"); //每条记录数据之间的间隔标签"$"
- }
- }
- else //没有查询结果时
- {
- strcpy(result_str,"NULL");
- }
- }
- mysql_free_result(res_ptr);
- }
- mysql_close(&mysql_connection);
- return result_str;
- }
- else
- {
- fprintf(stderr,"Connect failed/n");
- if(mysql_errno(&mysql_connection))
- {
- fprintf(stderr,"connection error %d:%s/n",mysql_errno(&mysql_connection),mysql_error(&mysql_connection));
- }
- return NULL;
- }
- }
- /*定义button_run_click函数*/
- void button_run_click()
- {
- struct sockaddr_in server_addr;
- struct sockaddr_in client_addr;
- int listen_describe;
- int client_describe;
- int port;
- socklen_t addr_length;
- char receive_buf[100];
- char send_buf[2000];
- int bind_flag;
- int listen_flag;
- int receive_num;
- char *temp_str;
- bzero(receive_buf,sizeof(receive_buf));
- bzero(send_buf,sizeof(send_buf));
- bzero(temp_str,sizeof(temp_str));
- memset((char *)&server_addr,0,sizeof(server_addr));
- server_addr.sin_family=AF_INET;
- server_addr.sin_addr.s_addr=htons(INADDR_ANY);
- port=DEF_PORT;
- server_addr.sin_port=htons((u_short)port);
- /*创建一个用于监听的流式套接字*/
- listen_describe=socket(AF_INET,SOCK_STREAM,0);
- printf("create socket successfully/n");
- if(listen_describe<0)
- {
- fprintf(stderr,"socket create failed/n");
- exit(1);
- }
- /*将本地地址帮定到监听套接字上*/
- bind_flag=bind(listen_describe,(struct sockaddr *)&server_addr,sizeof(server_addr));
- if(bind_flag<0)
- {
- fprintf(stderr,"bind failed/n");
- exit(1);
- }
- /*开始监听,并指定监听套接字请求队列的长度*/
- listen_flag=listen(listen_describe,MAXLINK);
- if(listen_flag<0)
- {
- fprintf(stderr,"listen failed/n");
- exit(1);
- }
- /*服务器主循环,接收和处理来自客户端的请求*/
- while(1)
- {
- addr_length=sizeof(client_addr);
- client_describe=accept(listen_describe,(struct sockaddr *)&client_addr,&addr_length);
- if(client_describe<0)
- {
- fprintf(stderr,"accept failed/n");
- exit(1);
- }
- printf("connect successfully/n");
- receive_num=recv(client_describe,receive_buf,sizeof(receive_buf),0);
- printf("receive_num=%d/n",receive_num);
- /*while(receive_num>0)
- {
- write(1,receive_buf,receive_num);
- receive_num=recv(client_describe,receive_buf,sizeof(receive_buf),0);
- }*/
- printf("server receive message is :%s/n",receive_buf);
- /*调用mysql_connect()函数根据用户的查询语句进行查询相关的结果*/
- temp_str=mysql_connect(receive_buf);
- bzero(receive_buf,sizeof(receive_buf));
- memcpy(send_buf,temp_str,strlen(temp_str));
- send(client_describe,send_buf,strlen(send_buf),0);
- printf("server send message is :%s/n",send_buf);
- bzero(send_buf,sizeof(send_buf));
- close(client_describe);
- }
- exit(0);
- }
- int main(int argc,char *argv[])
- {
- GtkWidget *window;
- GtkWidget *button_run;
- //GtkWidget *vbox;
- /*初始化*/
- gtk_init(&argc,&argv);
- /*创建窗口*/
- window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
- gtk_window_set_title(GTK_WINDOW(window),"服务器");
- gtk_widget_set_size_request(window,200,200);
- /*创建fixed布局容器*/
- //vbox=gtk_vbox_new(TRUE,1);
- //gtk_container_add(GTK_CONTAINER(window),vbox);
- /*创建Button*/
- button_run=gtk_button_new_with_label("Run");
- gtk_widget_set_size_request(button_run,100,70);
- //gtk_container_add(GTK_CONTAINER(vbox),button_run);
- gtk_container_add(GTK_CONTAINER(window),button_run);
- g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
- g_signal_connect(G_OBJECT(button_run),"clicked",G_CALLBACK(button_run_click),NULL);
- gtk_widget_show_all(window);
- gtk_main();
- return 0;
- }
- 分布式应用 GTK+Mysql+socket 简易图书馆查询系统
- EJB开发详细步骤及实例 MyEclipse+JBose+MySql 简易图书馆查询系统
- erlang简易分布式应用-----银行存储查询。
- TOJ3582图书馆查询系统
- 简易成绩查询系统
- 简易成绩查询系统
- 简易数据库查询系统
- 台州学院ACM:3582 图书馆查询系统
- 图书馆 SQL查询系统 提升训练
- javaee综合应用---图书馆系统项目
- 简易学生信息查询系统
- 【C++】简易交通查询系统
- DIY一个简易查询系统
- 图书馆系统
- 图书馆系统
- 理知道:一款图书馆图书查询安卓应用
- 分布式架构--简易版支付系统
- 什么是“分布式应用系统”
- java面试题------基础知识点的“汇总
- 读《大话设计模式》---观察者模式(Observer)
- 学习方法
- 系统栈的相关问题(2)---eip的修改
- ee
- 分布式应用 GTK+Mysql+socket 简易图书馆查询系统
- vpn for ubuntu 8.04/8.10
- 微波炉的维修(1) (转自谢工摆渡的博客)
- 本人转的j2ee学习资料,共享给大家
- libfetion 在ubuntu下的中文输入
- 微波炉的维修(2)(转自谢工摆渡的博客)
- 怎么解决点右键无法新建文本文档的问题
- 使用XMLDocment遍历CSDN论坛帖子回复
- 我常上的网站