分布式应用 GTK+Mysql+socket 简易图书馆查询系统

来源:互联网 发布:js获取时间差毫秒 编辑:程序博客网 时间:2024/05/16 18:52
      这是我的分布式计算环境作业,用到的GTK,Mysql,socket都是第一次使用,边学边用,大概用了十天的时间编写完的,大部分时间还是上课...
      程序还有N多Bug,没时间调了,姑且就先这样,反正作业要求的都实现了,...*^_^*…
       中间还有几个比较笨的地方,比如客户端对从服务器接收来的信息进行分析拆解时,我只是假设最多只有两条记录,当然这是不可能的,但3条以上的记录时,通过罗列sscan()中的格式串也能实现,不过觉得肯定不能这样实现,太原始了,现在只是有个初始的改进想法,时间不多了,就先放着了...
      操作系统使用的是Ubuntu8.04...
    
  1. /*简易图书馆查询系统客户端*/
  2. /*编译命令 gcc -o lib_app lib_app.c `pkg-config --libs --cflags gtk+-2.0`*/
  3. #include<gtk/gtk.h>
  4. #include<sys/types.h>
  5. #include<sys/socket.h>
  6. #include<netinet/in.h>
  7. #include<arpa/inet.h>
  8. #include<netdb.h>
  9. #include<stdio.h>
  10. #include<string.h>
  11. #include<stdlib.h>
  12. #include<arpa/inet.h>
  13. #define DEF_PORT 5188       /*默认的连接端口号*/
  14. #define MAXSIZE  2000       /*默认每次传输的最大字节数*/
  15. extern int errno;
  16. enum { LIST_ITEM=0,N_COLUMNS};
  17. GtkWidget *input_text;      /*用户查询输入框*/
  18. GtkWidget *list;        /*显示查询结果列表框*/
  19. int list_is_click=0;        /*判断list是否被选择*/
  20. char book_name[5][40];
  21. char author[5][40];
  22. char public_addr[5][40];
  23. char public_time[5][40]; 
  24. char abstract[5][500];
  25. char catalog[5][1000];      
  26. void on_list_changed();
  27. char *selected_book_name;   //返回类表框中用户选择的书籍名称
  28. int book_display_flag;      //判断要显示那本书的详细信息
  29. /*initializing the list widget*/
  30. static void init_list(GtkWidget *list)
  31. {
  32.    GtkListStore *store;
  33.    GtkCellRenderer *renderer;
  34.    GtkTreeViewColumn *column;
  35.    
  36.    renderer=gtk_cell_renderer_text_new();
  37.    column=gtk_tree_view_column_new_with_attributes("List Items",renderer,"text",LIST_ITEM,NULL);
  38.    gtk_tree_view_append_column(GTK_TREE_VIEW(list),column);
  39.    store=gtk_list_store_new(N_COLUMNS,G_TYPE_STRING);
  40.    gtk_tree_view_set_model(GTK_TREE_VIEW(list),GTK_TREE_MODEL(store));
  41.    g_object_unref(store);
  42. }
  43.    
  44. /*add item to the list */
  45. static void add_to_list(GtkWidget *list,const gchar *str)
  46. {
  47.    GtkListStore *store;
  48.    GtkTreeIter iter;
  49.  
  50.    store=GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(list)));
  51.    gtk_list_store_append(store,&iter);
  52.    gtk_list_store_set(store,&iter,LIST_ITEM,str,-1);
  53. }
  54. /*清除列表框中的项目*/
  55. static void remove_all(GtkWidget *widget, gpointer selection)
  56. {
  57.   GtkListStore *store;
  58.   GtkTreeModel *model;
  59.   GtkTreeIter  iter;
  60.   store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW (list)));
  61.   model = gtk_tree_view_get_model (GTK_TREE_VIEW (list));
  62.   if (gtk_tree_model_get_iter_first(model, &iter) == FALSE) 
  63.       return;
  64.   gtk_list_store_clear(store);
  65. }
  66. /*用户单击OK按钮时显示选取的书籍名称*/
  67. void show_info(GtkWidget *widget,gpointer window)
  68. {
  69.    GtkWidget *dialog;
  70.    
  71.    dialog=gtk_message_dialog_new(window, GTK_DIALOG_DESTROY_WITH_PARENT,GTK_MESSAGE_INFO,GTK_BUTTONS_OK,selected_book_name,"title");
  72.    gtk_window_set_title(GTK_WINDOW(dialog),"返回信息");
  73.    gtk_dialog_run(GTK_DIALOG(dialog));
  74.    gtk_widget_destroy(dialog);
  75. }
  76. void help_info(GtkWidget *widget,gpointer window)
  77. {
  78.    GtkWidget *dialog;
  79.    
  80.    char help_info[100]="本简易图书馆查询系统中共有5本书:排队论,/nc程序设计教程,C语言程序设计入门,英语听说教程,Ubuntu Linux 入门到精通/n";
  81.    dialog=gtk_message_dialog_new(window, GTK_DIALOG_DESTROY_WITH_PARENT,GTK_MESSAGE_INFO,GTK_BUTTONS_OK,help_info,"title");
  82.    gtk_window_set_title(GTK_WINDOW(dialog),"帮助信息");
  83.    gtk_dialog_run(GTK_DIALOG(dialog));
  84.    gtk_widget_destroy(dialog);
  85. }
  86. /*帮助信息*/
  87. /*改变窗口图标*/
  88. GdkPixbuf *create_icon(const gchar *icon_name)
  89. {
  90.    GdkPixbuf *icon;
  91.    GError *error=NULL;
  92.    icon=gdk_pixbuf_new_from_file(icon_name,&error);
  93.    if(!icon)
  94.      {
  95.     fprintf(stderr,"%s/n",error->message);
  96.     g_error_free(error);
  97.      }
  98.    return icon;
  99. }
  100. /*当用户点击查询按钮后将开始与服务器端进行连接*/
  101. void button_search_click()
  102. {
  103.    struct hostent *ptrhost;     /*指向主机列表中的一个条目的指针*/
  104.    struct sockaddr_in server_addr;  /*存档服务器端网络地址的结构 */
  105.    int socket_describe;         /*客户端套接字描述符*/
  106.    int port;                /*服务器端套接字协议端口号*/
  107.    int receive_num;         /*客户端接收到的字节数*/
  108.    char *host="localhost";      /*服务器主机名称指针*/
  109.    char receive_buf[MAXSIZE];       /*接收服务器发送过来的数据缓冲区*/
  110.    char send_buf[100];          /*向服务器发送用户的查询信息缓冲区*/
  111.    int connect_flag; 
  112.    char *search_book;           /*存储用户的查询输入*/
  113.    char send_flag;
  114.    GtkTreeSelection *selection;
  115.   
  116.    selection  = gtk_tree_view_get_selection(GTK_TREE_VIEW(list));
  117.    remove_all(list,selection);
  118.    bzero(search_book,sizeof(search_book));
  119.    search_book=(char *)gtk_entry_get_text((GtkEntry *)input_text);
  120.    bzero(send_buf,sizeof(send_buf));
  121.    memset(receive_buf,0,sizeof(receive_buf));
  122.    memcpy(send_buf,search_book,strlen(search_book));
  123.    printf("你要查询的书籍是: %s/n",send_buf);
  124.    
  125.    memset((char*)&server_addr,0,sizeof(server_addr));
  126.    server_addr.sin_family=AF_INET;
  127.    port=DEF_PORT;
  128.    server_addr.sin_port=htons((u_short)port); 
  129.   
  130.    ptrhost=gethostbyname(host);
  131.    if((char *)ptrhost==NULL)
  132.      {
  133.     fprintf(stderr,"invalid host %s",host);
  134.     exit(1);
  135.      }
  136.    memcpy(&server_addr.sin_addr,ptrhost->h_addr,ptrhost->h_length);
  137.    
  138. /*创建套接字*/
  139.    socket_describe=socket(AF_INET,SOCK_STREAM,0);
  140.    if(socket_describe<0)
  141.      {
  142.     fprintf(stderr,"socket create failed/n");
  143.     exit(1);
  144.      }
  145.     printf("create socket successfully/n");
  146. /*请求连接到服务器*/
  147.     connect_flag=connect(socket_describe,(struct sockaddr *)&server_addr,sizeof(server_addr));
  148.     if(connect_flag<0)
  149.       {
  150.     fprintf(stderr,"connect failed");
  151.     exit(1);
  152.       }
  153.    printf("connect successfully/n");
  154.         
  155.    send_flag=send(socket_describe,send_buf,strlen(send_buf),0);
  156.    printf("client send size is: %d/n",send_flag);
  157.    printf("client send message is :%s/n",send_buf);
  158.    bzero(send_buf,sizeof(send_buf));
  159.    receive_num=recv(socket_describe,receive_buf,sizeof(receive_buf),0); 
  160.    printf("client receive_num is :%d/n",receive_num);
  161.    while(receive_num>0)
  162.      {
  163.     receive_num=recv(socket_describe,receive_buf,sizeof(receive_buf),0);
  164.      }
  165.    printf("client receive message is :%s/n",receive_buf);
  166. /*把从服务器接收到的数据进行提取如book_name,author,public_addr等信息,利用强大的函数sscaf()*^_^*暂时现利用各比较理想的方法--列举法,假设知道返回的书籍不会多余5本,以后有时间在改进下,暂时还想不出什么比较好的方法,时间不多了*/ 
  167.   if(receive_buf=="NULL")
  168.     {
  169.        add_to_list(list,"没有你所要查找的书籍");
  170.     }
  171.    else
  172.     {
  173.        char multi_flag[50];     //通过sscaf()函数从receive_buf中提取出每条记录之间的分隔符$之后的一个字符,如果这个字符不为空,表示还有信息,如果为空,表示没有了
  174.        bzero(multi_flag,sizeof(multi_flag));
  175.        sscanf(receive_buf,"%*[^$]$%[^#]",multi_flag);
  176.        printf("multi_flag is :%s/n",multi_flag);
  177.        printf("size of multi_flag is %d/n",strlen(multi_flag));
  178.     /*如果返回结果只有一本书*/
  179.        if(multi_flag==NULL||strlen(multi_flag)==0)
  180.          {
  181.         sscanf(receive_buf,"%[^#]#%[^#]#%[^#]#%[^#]#%[^#]#%[^#]#",book_name[0],author[0],public_addr[0],public_time[0],abstract[0],catalog[0]);
  182.             printf("book name is %s/n",book_name[0]);
  183.         if(book_name=="NULL")
  184.           {
  185.         add_to_list(list,"没有你所要查找的书籍");
  186.           }
  187.             else
  188.           {
  189.         add_to_list(list,book_name[0]);
  190.           }
  191.          }
  192.     /*返回结果有多本书*/
  193.     else
  194.          {
  195.        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]);
  196.        init_list(list);
  197.        add_to_list(list,book_name[0]);   
  198.        add_to_list(list,book_name[1]);
  199.          }
  200.      }
  201. }
  202.  
  203. void destroy(GtkWidget *widget, gpointer *data)
  204. {
  205.    gtk_widget_destroy(GTK_WIDGET(data));
  206.    /*bzero(author,sizeof(author));
  207.    bzero(public_addr,sizeof(public_addr));
  208.    bzero(public_time,sizeof(public_time));
  209.    bzero(abstract,sizeof(abstract));
  210.    bzero(catalog,sizeof(catalog));*/
  211. }
  212. /*当用户点击button_detail按钮时触发此函数*/
  213. void button_detail_click()
  214. {
  215.    GtkWidget *button;
  216.    GtkWidget *dialog;
  217.    GtkWidget *vbox_d;
  218.    GtkWidget *hbox1_d;
  219.    GtkWidget *hbox2_d;
  220.    GtkWidget *hbox3_d;
  221.    GtkWidget *hbox4_d;
  222.    GtkWidget *hbox5_d;
  223.    GtkWidget *fixed;
  224.    GtkWidget *label0,*label1,*label2,*label3,*label4,*label5,*label6,*label7,*label8,*label9;
  225.    GtkWidget *halign1;
  226.    GtkWidget *halign2;
  227.    GtkWidget *halign3;
  228.    GtkWidget *halign4;
  229.    GtkWidget *halign5;
  230.    int choosed;         //判断该显示那本书的详细信息
  231.    if(!strcmp(selected_book_name,book_name[0]))
  232.       choosed=0;
  233.    if(!strcmp(selected_book_name,book_name[1]))
  234.       choosed=1;
  235.     dialog=gtk_dialog_new( );
  236.     halign1=gtk_alignment_new(0,0,0,0);
  237.     vbox_d=gtk_vbox_new(FALSE,5);
  238.     hbox1_d=gtk_hbox_new(FALSE,5);
  239.     label0 = gtk_label_new ("作者:");
  240.     gtk_container_add(GTK_CONTAINER(hbox1_d), label0);
  241.     label1= gtk_label_new (NULL);
  242.     gtk_label_set_text(label1,author[choosed]);
  243.     gtk_container_add(GTK_CONTAINER(hbox1_d), label1);
  244.     gtk_container_add(GTK_CONTAINER(halign1), hbox1_d);
  245.     gtk_container_add(GTK_CONTAINER(vbox_d), halign1);
  246.     halign2=gtk_alignment_new(0,0,0,0);
  247.     hbox2_d=gtk_hbox_new(FALSE,5);
  248.     label2 = gtk_label_new ("出版社:");
  249.     gtk_container_add(GTK_CONTAINER(hbox2_d), label2);
  250.     label3= gtk_label_new (NULL);
  251.     gtk_label_set_text(label3,public_addr[choosed]);
  252.     gtk_container_add(GTK_CONTAINER(hbox2_d), label3);
  253.     gtk_container_add(GTK_CONTAINER(halign2), hbox2_d);
  254.     gtk_container_add(GTK_CONTAINER(vbox_d), halign2);
  255.     halign3=gtk_alignment_new(0,0,0,0);
  256.     hbox3_d=gtk_hbox_new(FALSE,5);
  257.     label4 = gtk_label_new ("出版时间:");
  258.     gtk_container_add(GTK_CONTAINER(hbox3_d), label4);
  259.     label5= gtk_label_new (NULL);
  260.     gtk_label_set_text(label5, public_time[choosed]);
  261.     gtk_container_add(GTK_CONTAINER(hbox3_d), label5);
  262.     gtk_container_add(GTK_CONTAINER(halign3), hbox3_d);
  263.     gtk_container_add(GTK_CONTAINER(vbox_d), halign3);
  264.     halign4=gtk_alignment_new(0,0,0,0);
  265.     hbox4_d=gtk_hbox_new(FALSE,5);
  266.     label6 = gtk_label_new ("内容简介:");
  267.     gtk_container_add(GTK_CONTAINER(hbox4_d), label6);
  268.     label7= gtk_label_new (NULL);
  269.     gtk_label_set_text(label7,abstract[choosed]);
  270.     gtk_container_add(GTK_CONTAINER(hbox4_d), label7);
  271.     gtk_container_add(GTK_CONTAINER(halign4), hbox4_d);
  272.     gtk_container_add(GTK_CONTAINER(vbox_d), halign4);
  273.     
  274.     halign5=gtk_alignment_new(0,0,0,0);
  275.     hbox5_d=gtk_hbox_new(FALSE,5); 
  276.     label8 = gtk_label_new ("章节目录:");
  277.     gtk_container_add(GTK_CONTAINER(hbox5_d), label8);
  278.     label9= gtk_label_new (NULL);
  279.     gtk_label_set_text(label9,catalog[choosed]);
  280.     gtk_container_add(GTK_CONTAINER(hbox5_d), label9);
  281.     gtk_container_add(GTK_CONTAINER(halign5), hbox5_d);
  282.     gtk_container_add(GTK_CONTAINER(vbox_d), halign5);
  283.     fixed=gtk_fixed_new();
  284.     button=gtk_button_new_with_label("Yes");
  285.     gtk_widget_set_size_request (button, 100, 40);
  286.     gtk_fixed_put(GTK_FIXED(fixed),button,220,50);
  287.     gtk_container_add(GTK_CONTAINER(vbox_d),fixed);
  288.     gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area),vbox_d,TRUE,TRUE,0);
  289.     g_signal_connect(GTK_OBJECT(button),"clicked",G_CALLBACK(destroy),dialog);
  290.     gtk_widget_show_all(dialog);
  291. }
  292. void on_list_changed(GtkWidget *widget)
  293. {
  294.    GtkTreeIter iter;
  295.    GtkTreeModel *model;
  296.     
  297.    list_is_click=1;
  298.    if(gtk_tree_selection_get_selected(GTK_TREE_SELECTION(widget),&model,&iter))
  299.      {
  300.     gtk_tree_model_get(model,&iter,LIST_ITEM,&selected_book_name,-1);
  301.     printf("choosed book name is :%s/n",selected_book_name);
  302.      }
  303. }
  304. int main(int argc,char *argv[])
  305. {
  306.    GtkWidget *window;
  307.    GtkWidget *label1;
  308.    GtkWidget *table;
  309.    GtkWidget *button_help,*button_ok;
  310.    GtkWidget *button_search;
  311.    GtkWidget *button_detail;
  312.    GtkWidget *halign1;
  313. /*初始化*/
  314.    gtk_init(&argc,&argv);
  315. /*创建窗口window*/
  316.    window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
  317.    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
  318.    gtk_window_set_title(GTK_WINDOW(window),"简易图书馆查询系统");
  319.    gtk_widget_set_size_request(window,300,300);
  320.    gtk_window_set_icon(GTK_WINDOW(window),create_icon("icon.gif"));
  321. /*创建Table控件*/
  322.    table=gtk_table_new(6,4,TRUE);
  323.    gtk_container_add(GTK_CONTAINER(window),table);
  324. /*创建用户查询输入框input_text*/
  325.    input_text=gtk_entry_new();
  326.    gtk_table_attach(GTK_TABLE(table),input_text,0,3,0,1,GTK_FILL|GTK_SHRINK,GTK_FILL|GTK_SHRINK,5,5);
  327.    
  328. /*创建查询按钮button_search*/
  329.    button_search=gtk_button_new_with_label("Search");
  330.    gtk_widget_set_size_request(button_search,60,30);
  331.    gtk_table_attach(GTK_TABLE(table),button_search,3,4,0,1,GTK_FILL|GTK_SHRINK,GTK_FILL|GTK_SHRINK,5,5);
  332.   
  333. /*创建查询结果提示label1*/
  334.    halign1=gtk_alignment_new(0,0,0,0);
  335.    label1=gtk_label_new("Search Results:");
  336.    gtk_container_add(GTK_CONTAINER(halign1),label1);
  337.    gtk_table_attach(GTK_TABLE(table),halign1,0,2,1,2,GTK_FILL|GTK_SHRINK,GTK_FILL|GTK_SHRINK,5,5);
  338. /*create and initializing the list view*/
  339.    list=gtk_tree_view_new();
  340.    gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(list),FALSE);
  341.    gtk_table_attach(GTK_TABLE(table),list,0,3,2,5,GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND,5,5);
  342.    //init_list(list);
  343. /*cteate button_detail*/
  344.    button_detail=gtk_button_new_with_label("Detail");
  345.    gtk_table_attach(GTK_TABLE(table),button_detail,3,4,2,3,GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND,5,5);
  346. /*create button_help*/
  347.    button_help=gtk_button_new_with_label("Help");
  348.    gtk_table_attach(GTK_TABLE(table),button_help,0,1,5,6,GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND,5,5);
  349. /*create button_ok*/
  350.    button_ok=gtk_button_new_with_label("Ok");
  351.    gtk_table_attach(GTK_TABLE(table),button_ok,3,4,5,6,GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND,5,5);
  352. /*显示窗口及所有控件*/
  353.    gtk_widget_show_all(window); 
  354.    g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
  355.    g_signal_connect(G_OBJECT(button_search),"clicked",G_CALLBACK(button_search_click),NULL);
  356.    g_signal_connect(G_OBJECT(button_detail),"clicked",G_CALLBACK(button_detail_click),NULL);
  357.    g_signal_connect(gtk_tree_view_get_selection(GTK_TREE_VIEW(list)),"changed",G_CALLBACK(on_list_changed),NULL);
  358.    g_signal_connect(G_OBJECT(button_ok), "clicked", G_CALLBACK(show_info), (gpointer) window); 
  359.    g_signal_connect(G_OBJECT(button_help), "clicked", G_CALLBACK(help_info), (gpointer) window);
  360.    //update_widget_bg(GTK_WIDGET(window), "background.jpg");
  361.    gtk_main();
  362.    return 0;
  363. }
  1. /*简易图书查询系统服务器端*/
  2. //////////////////server////////////////////////////
  3. /*编译时使用语句gcc -o lib_app_server lib_app_server.c `pkg-config --libs --cflags gtk+-2.0` `mysql_config --cflags --libs`*/
  4. #include<gtk/gtk.h>
  5. #include<sys/types.h>
  6. #include<sys/socket.h>
  7. #include<netinet/in.h>
  8. #include<netdb.h>
  9. #include<stdio.h>
  10. #include<string.h>
  11. #include<stdlib.h>
  12. #include<arpa/inet.h>
  13. #include"/usr/include/mysql/mysql.h"
  14. #include<unistd.h>
  15. #define DEF_PORT 5188
  16. #define MAXLINK 10
  17. /*mysql_connect()函数定义,连接mysql数据库并根据用户的输入查询相关的结果*/
  18. char* mysql_connect(char *str)
  19. {
  20.    char *search_str;
  21.    MYSQL mysql_connection;
  22.    MYSQL_RES *res_ptr;
  23.    MYSQL_ROW sqlrow;
  24.    int res;
  25.    int result_rows;         //查询结果的行数;
  26.    MYSQL_FIELD *fields;
  27.    char *result_str;
  28.    //bzero(search_str,sizeof(search_str));
  29.    sprintf(search_str,"select * from library where book_name regexp '%s'",str);
  30.    printf("search_str is :%s/n",search_str);
  31.    //bzero(result_str,sizeof(result_str));  
  32.    result_str=(char *)malloc(sizeof(char)*1500);
  33. /*初始化并进行连接*/
  34.    mysql_init(&mysql_connection);
  35.    if(mysql_real_connect(&mysql_connection,"localhost","root","********","bookstore",0,NULL,CLIENT_FOUND_ROWS))
  36.      {
  37.     printf(" Mysql connected successfully/n");
  38.     res=mysql_query(&mysql_connection,search_str);
  39.     printf("search_str is :%s/n",search_str);
  40.     if(res)
  41.       {
  42.          printf("select error:%s/n",mysql_error(&mysql_connection));//43
  43.       }
  44.     else
  45.       {
  46.          res_ptr=mysql_store_result(&mysql_connection);               
  47.          if(res_ptr)                //有查询结果时
  48.         {
  49.            result_rows=mysql_num_rows(res_ptr);
  50.            /*如果查询的结果只有一条记录*/
  51.            if(result_rows==1)           
  52.               {
  53.             sqlrow=mysql_fetch_row(res_ptr);  
  54.                 
  55.                         bzero(result_str,sizeof(result_str));
  56.             printf("book_name is :%s/n",sqlrow[0]);
  57.             printf("author is :%s/n",sqlrow[1]);
  58.             printf("public_addr is :%s/n",sqlrow[2]);
  59.             printf("public_time is :%s/n",sqlrow[3]);
  60.             printf("abstract is :%s/n",sqlrow[4]);
  61.             printf("catalog is :%s/n",sqlrow[5]);
  62.             
  63.             //sprintf(result_str,"%s%s%s%s%s%s/n",sqlrow[0],sqlrow[1],sqlrow[2],sqlrow[3],sqlrow[4],sqlrow[5]);
  64.             int i=0;        
  65.             for(i=0;i<6;i++) 
  66.               {  
  67.                  strcat(result_str,sqlrow[i]);
  68.                  strcat(result_str,"#");            //插入每列之间的间隔标签"#",以便客户端分析接收到的数据
  69.               }
  70.             strcat(result_str,"$#");
  71.             printf("result_str is :%s/n",result_str);     
  72.               }     
  73.             /*如果查询记录多于一条*/
  74.             else if(result_rows>1) 
  75.               {
  76.             char temp_str[1000];
  77.             bzero(result_str,sizeof(result_str));
  78.                         printf("result rows is: %d/n",result_rows);
  79.             //sqlrow=mysql_fetch_row(res_ptr);
  80.             while(sqlrow=mysql_fetch_row(res_ptr))
  81.                {
  82.                  int tmp=0;
  83.                  for(tmp=0;tmp<6;tmp++)
  84.                    {
  85.                   strcat(temp_str,sqlrow[tmp]);
  86.                   strcat(temp_str,"#");         //一条记录中各列之间的间隔标签"#"
  87.                    }
  88.                  strcat(result_str,temp_str);
  89.                  bzero(temp_str,sizeof(temp_str));
  90.                  printf("multi rows result is:%s/n",result_str);
  91.                  strcat(result_str,"$");            //每条记录数据之间的间隔标签"$"
  92.                }  
  93.               } 
  94.             else                        //没有查询结果时
  95.              {
  96.                 strcpy(result_str,"NULL");
  97.              }  
  98.         }  
  99.          mysql_free_result(res_ptr);            
  100.           }
  101.     mysql_close(&mysql_connection);
  102.     return result_str;
  103.       }
  104.    else  
  105.       {
  106.     fprintf(stderr,"Connect failed/n");
  107.     if(mysql_errno(&mysql_connection))
  108.       {
  109.          fprintf(stderr,"connection error %d:%s/n",mysql_errno(&mysql_connection),mysql_error(&mysql_connection));
  110.       }
  111.     return NULL;
  112.       }
  113.     
  114. }
  115. /*定义button_run_click函数*/
  116. void button_run_click()
  117. {
  118.    struct sockaddr_in server_addr;
  119.    struct sockaddr_in client_addr;
  120.    int listen_describe;
  121.    int client_describe;
  122.    int port;
  123.    socklen_t addr_length;
  124.    char receive_buf[100];
  125.    char send_buf[2000];
  126.    int bind_flag;
  127.    int listen_flag;
  128.    int receive_num;
  129.    char *temp_str;
  130.   
  131.    bzero(receive_buf,sizeof(receive_buf));
  132.    bzero(send_buf,sizeof(send_buf));
  133.    bzero(temp_str,sizeof(temp_str));
  134.    memset((char *)&server_addr,0,sizeof(server_addr));
  135.    server_addr.sin_family=AF_INET;
  136.    server_addr.sin_addr.s_addr=htons(INADDR_ANY);
  137.    port=DEF_PORT;
  138.    server_addr.sin_port=htons((u_short)port);
  139. /*创建一个用于监听的流式套接字*/
  140.    listen_describe=socket(AF_INET,SOCK_STREAM,0);
  141.    printf("create socket successfully/n");
  142.    if(listen_describe<0)
  143.      {
  144.     fprintf(stderr,"socket create failed/n");
  145.     exit(1);
  146.      }
  147.   
  148. /*将本地地址帮定到监听套接字上*/
  149.    bind_flag=bind(listen_describe,(struct sockaddr *)&server_addr,sizeof(server_addr));
  150.    if(bind_flag<0)
  151.      {
  152.     fprintf(stderr,"bind failed/n");
  153.     exit(1);
  154.      }
  155. /*开始监听,并指定监听套接字请求队列的长度*/
  156.    listen_flag=listen(listen_describe,MAXLINK);
  157.    if(listen_flag<0)
  158.      {
  159.     fprintf(stderr,"listen failed/n");
  160.     exit(1);
  161.      }
  162. /*服务器主循环,接收和处理来自客户端的请求*/
  163.    while(1)
  164.      {
  165.     addr_length=sizeof(client_addr);
  166.     client_describe=accept(listen_describe,(struct sockaddr *)&client_addr,&addr_length);
  167.     if(client_describe<0)
  168.       {
  169.          fprintf(stderr,"accept failed/n");
  170.          exit(1);
  171.           }
  172.     printf("connect successfully/n");
  173.     receive_num=recv(client_describe,receive_buf,sizeof(receive_buf),0);
  174.     printf("receive_num=%d/n",receive_num);
  175.     /*while(receive_num>0)
  176.           {
  177.          write(1,receive_buf,receive_num);
  178.          receive_num=recv(client_describe,receive_buf,sizeof(receive_buf),0);
  179.           }*/
  180.     printf("server receive message is :%s/n",receive_buf);
  181.     /*调用mysql_connect()函数根据用户的查询语句进行查询相关的结果*/   
  182.     temp_str=mysql_connect(receive_buf);
  183.     bzero(receive_buf,sizeof(receive_buf));
  184.     memcpy(send_buf,temp_str,strlen(temp_str));
  185.     send(client_describe,send_buf,strlen(send_buf),0);
  186.         printf("server send message is :%s/n",send_buf);
  187.         bzero(send_buf,sizeof(send_buf));
  188.     close(client_describe);      
  189.       }
  190.    exit(0);
  191. }
  192. int main(int argc,char *argv[])
  193. {
  194.    GtkWidget *window;
  195.    GtkWidget *button_run;
  196.    //GtkWidget *vbox;
  197.    
  198. /*初始化*/
  199.    gtk_init(&argc,&argv);
  200.    
  201. /*创建窗口*/
  202.    window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
  203.    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
  204.    gtk_window_set_title(GTK_WINDOW(window),"服务器");
  205.    gtk_widget_set_size_request(window,200,200);
  206.    
  207. /*创建fixed布局容器*/
  208.    //vbox=gtk_vbox_new(TRUE,1);
  209.    //gtk_container_add(GTK_CONTAINER(window),vbox);
  210. /*创建Button*/
  211.    button_run=gtk_button_new_with_label("Run");
  212.    gtk_widget_set_size_request(button_run,100,70);
  213.    //gtk_container_add(GTK_CONTAINER(vbox),button_run);
  214.    gtk_container_add(GTK_CONTAINER(window),button_run);
  215.    
  216.    g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
  217.    g_signal_connect(G_OBJECT(button_run),"clicked",G_CALLBACK(button_run_click),NULL);  
  218.    gtk_widget_show_all(window);
  219.    gtk_main();
  220.    return 0;
  221. }
     
原创粉丝点击