免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 34839 | 回复: 3
打印 上一主题 下一主题

C/S模式的GTK聊天程序,C语言编写,运行不出结果,跪求指教~~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-16 14:51 |只看该作者 |倒序浏览
本帖最后由 mybooks_zzz 于 2014-05-17 07:58 编辑
  1. #include<glib.h>
  2. #include<stdio.h>
  3. #include<fcntl.h>
  4. #include<signal.h>
  5. #include<sys/socket.h>
  6. #include<sys/types.h>
  7. #include<sys/time.h>
  8. #include<unistd.h>
  9. #include<netdb.h>
  10. #include<netinet/in.h>


  11. #define OURPORT 8088
  12. #define MAX_USERS 8

  13. struct _client{
  14.         gint sd;
  15.         gboolean in_use;
  16.         gchar name[64];
  17.         gchar buf[1024];
  18. };
  19. typedef struct _client client;
  20. client user[MAX_USERS];

  21. void do_service(gpointer id)
  22. {
  23.         gint j;
  24.         char tobuf[1024];

  25.         while(read(user[GPOINTER_TO_INT(id)].sd,user[GPOINTER_TO_INT(id)].buf,1024)!= -1)
  26. {
  27.         sprintf(tobuf,"%s:%s\n",user[GPOINTER_TO_INT(id)].name,user[GPOINTER_TO_INT(id)].buf);
  28.         for(j= 0;j<MAX_USERS;j++)
  29.         {
  30.                 if(user[j].in_use)
  31.                 {
  32.                         write(user[j].sd,tobuf,1024);
  33.                         g_print("%s",tobuf);
  34.                 }
  35.         }
  36. }
  37. user[GPOINTER_TO_INT(id)].in_use=FALSE;
  38. close(user[GPOINTER_TO_INT(id)].sd);
  39. }

  40. int main(int argc,char *argv[])
  41. {
  42.         gint sd,newsd;
  43.         struct sockaddr_in *sin;
  44.         gint slen;
  45.         gint count= 0;
  46.         gint flags;
  47.         gchar buf[1024];
  48.         gchar tobuf[1024];
  49.         gint length,i,j;
  50.        
  51.         if(!g_thread_supported())
  52.                 g_thread_init(NULL);
  53.         else
  54.                 g_print("thread not supported\n");
  55.         sd= socket(AF_INET,SOCK_STREAM,0);
  56.         if(sd== -1)
  57.         {
  58.                 g_print("create socket error!\n");
  59.                 return -1;
  60.         }

  61.         sin= g_new(struct sockaddr_in,1);
  62.         sin->sin_family=AF_INET;
  63.         sin->sin_port=OURPORT;
  64.         slen=sizeof(struct sockaddr_in);
  65.        
  66.         if(bind(sd,sin,slen)< 0)
  67.         {
  68.                 g_print("bind erro!\n");
  69.                 return -1;
  70.         }

  71.         if(listen(sd,8)<0)
  72.         {
  73.                 g_print("listen error!\n");
  74.                 return -1;
  75.         }

  76.         for(i=0;i<MAX_USERS;i++)
  77.                 user[i].in_use=FALSE;

  78.         flags= fcntl(sd,F_GETFL);
  79.         fcntl(sd,F_SETFL,flags&~O_NDELAY);

  80.         for(;;)
  81.         {
  82.                 newsd=accept(sd,sin,&slen);
  83.                 if(newsd== -1)
  84.                 {
  85.                         g_print("accept error!\n");
  86.                         break;
  87.                 }
  88.                 else
  89.                 {
  90.                         if(count>=MAX_USERS)
  91.                         {
  92.                                 sprintf(buf,"用户数量过多服务器不能连接。\n");
  93.                                 write(newsd,buf,1024);
  94.                                 close(newsd);
  95.                         }
  96.                         else
  97.                         {
  98.                                 flags = fcntl(user[i].sd,F_GETFL);
  99.                                 fcntl(user[i].sd,F_SETFL,O_NONBLOCK);
  100.                                 user[count].sd=newsd;
  101.                                 user[count].in_use=TRUE;
  102.                                 read(newsd,user[count].name,64);
  103.                                 g_thread_create((GThreadFunc)do_service,(gpointer)count,TRUE,NULL);
  104.                                 count++;
  105.                         }
  106.                 }
  107.         }
  108.         close(sd);
  109.         g_free(sin);
  110. }
复制代码
运行起来总是显示thread not supported。我的编译命令时gcc -o server  server.c `pkg-config --cflags --libs gtk+-2.0 gthread-2.0`
  1. #include<gtk/gtk.h>
  2. #include<string.h>
  3. #include<sys/types.h>
  4. #include<sys/socket.h>
  5. #include<netinet/in.h>

  6. #define OURPORT 8088

  7. gint sd;
  8. struct sockaddr_in s_in;
  9. gchar username[64];
  10. gchar buf[1024];
  11. gchar get_buf[1048];
  12. gboolean isconnected = FALSE;

  13. static GtkWidget *text;
  14. static GtkTextBuffer *buffer;
  15. static GtkWidget *message_entry;
  16. static GtkWidget *name_entry;
  17. static GtkWidget *login_button;

  18. void get_message(void)
  19. {
  20.         GtkTextIter iter;
  21.         gchar get_buf[1024];
  22.         gchar buf[1024];
  23.         while(read(sd,buf,1024)!= -1)
  24.         {
  25.                 sprintf(get_buf,"%s",buf);
  26.                 gdk_threads_enter();
  27.                 gtk_text_buffer_get_end_iter(buffer,&iter);
  28.                 gtk_text_buffer_insert(buffer,&iter,get_buf,-1);
  29.                 gdk_threads_leave();
  30.         }
  31. }

  32. void on_destroy(GtkWidget *widget,GdkEvent *event,gpointer data)
  33. {
  34.         sprintf(username,"guest");
  35.         if(do_connect()== TRUE)
  36.         {
  37.                 gtk_widget_set_sensitive(login_button,FALSE);
  38.                 g_thread_create((GThreadFunc)get_message,NULL,FALSE,NULL);
  39.         }
  40.         gtk_widget_destroy(widget);
  41. }

  42. void on_button_clicked(GtkButton *button,gpointer data)
  43. {
  44.         const gchar *name;
  45.         name=gtk_entry_get_text(GTK_ENTRY(name_entry));
  46.         sprintf(username,"%s",name);
  47.         if(do_connect())
  48.         {
  49.                 gtk_widget_set_sensitive(login_button,FALSE);
  50.                 g_thread_create((GThreadFunc)get_message,NULL,FALSE,NULL);
  51.         }
  52.         gtk_widget_destroy(data);
  53. }

  54. void create_win(void)
  55. {
  56.         GtkWidget *win,*vbox;
  57.         GtkWidget *button;

  58.         win=gtk_window_new(GTK_WINDOW_TOPLEVEL);
  59.         gtk_window_set_title(GTK_WINDOW(win),"输入用户名");
  60.         gtk_container_set_border_width(GTK_CONTAINER(win),10);
  61.         g_signal_connect(G_OBJECT(win),"delete_event",G_CALLBACK(on_destroy),NULL);
  62.         gtk_window_set_modal(GTK_WINDOW(win),TRUE);
  63.         gtk_window_set_position(GTK_WINDOW(win),GTK_WIN_POS_CENTER);

  64.         vbox=gtk_vbox_new(FALSE,0);
  65.         gtk_container_add(GTK_CONTAINER(win),vbox);
  66.        
  67.         name_entry=gtk_entry_new();
  68.         gtk_box_pack_start(GTK_BOX(vbox),name_entry,TRUE,TRUE,5);
  69.         button=gtk_button_new_from_stock(GTK_STOCK_OK);
  70.         g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(on_button_clicked),win);
  71.         gtk_box_pack_start(GTK_BOX(vbox),button,FALSE,FALSE,5);
  72.         gtk_widget_show_all(win);

  73. }

  74. gboolean do_connect(void)
  75. {
  76.         GtkTextIter iter;
  77.         gint slen;
  78.         sd=socket(AF_INET,SOCK_STREAM,0);
  79.         if(sd<0)
  80.         {
  81.                 gtk_text_buffer_get_end_iter(buffer,&iter);
  82.                 gtk_text_buffer_insert(buffer,&iter,"打开套接字时出错!\n",-1);
  83.                 return FALSE;
  84.         }
  85.         s_in.sin_family=AF_INET;
  86.         s_in.sin_port=OURPORT;
  87.         slen=sizeof(s_in);
  88.         if(connect(sd,&s_in,slen)<0)
  89.         {
  90.                 gtk_text_buffer_get_end_iter(buffer,&iter);
  91.                 gtk_text_buffer_insert(buffer,&iter,"连接服务器时出错!\n",-1);
  92.                 return FALSE;
  93.         }
  94.         else
  95.         {
  96.                 gtk_text_buffer_get_end_iter(buffer,&iter);
  97.                 gtk_text_buffer_insert(buffer,&iter,username,-1);
  98.                 gtk_text_buffer_get_end_iter(buffer,&iter);
  99.                 gtk_text_buffer_insert(buffer,&iter,"\n成功与服务器连接。。。\n",-1);
  100.                 write(sd,username,64);
  101.                 isconnected=TRUE;
  102.                 return TRUE;
  103.         }
  104. }

  105. void on_send(GtkButton *button,gpointer data)
  106. {
  107.         const char *message;

  108.         if(isconnected==FALSE) return;
  109.         message= gtk_entry_get_text(GTK_ENTRY(message_entry));
  110.         sprintf(buf,"%s\n",message);
  111.         write(sd,buf,1024);
  112.         gtk_entry_set_text(GTK_ENTRY(message_entry),"");
  113. }

  114. void on_login(GtkWidget *button,gpointer data)
  115. {
  116.         create_win;
  117. }

  118. void on_delete_event(GtkWidget *widget,GdkEvent *event,gpointer data)
  119. {
  120.         close(sd);
  121.         gtk_main_quit();
  122. }

  123. int main(int argc,char *argv[])
  124. {
  125.         GtkWidget *window;
  126.         GtkWidget *vbox,*hbox,*button,*label,*view;

  127.         if(!g_thread_supported())
  128.                 g_thread_init(NULL);
  129.         gtk_init(&argc,&argv);

  130.         window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
  131.         gtk_window_set_title(GTK_WINDOW(window),"客户端");
  132.         g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(on_delete_event),NULL);
  133.         gtk_container_set_border_width(GTK_CONTAINER(window),10);

  134.         vbox=gtk_vbox_new(FALSE,0);
  135.         gtk_container_add(GTK_CONTAINER(window),vbox);

  136.         hbox=gtk_hbox_new(FALSE,0);
  137.         gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,5);
  138.         label=gtk_label_new("点击登陆按钮连接服务器");
  139.         gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,5);
  140.         login_button=gtk_button_new_with_label("登录");
  141.         gtk_box_pack_start(GTK_BOX(hbox),login_button,FALSE,FALSE,5);
  142.         g_signal_connect(G_OBJECT(login_button),"clicked",G_CALLBACK(on_login),NULL);

  143.         view=gtk_scrolled_window_new(NULL,NULL);
  144.         gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(view),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
  145.         text=gtk_text_view_new();
  146.         gtk_box_pack_start(GTK_BOX(vbox),view,TRUE,TRUE,5);
  147.         gtk_container_add(GTK_CONTAINER(view),text);
  148.         buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(text));

  149.         hbox=gtk_hbox_new(FALSE,0);
  150.         gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,5);

  151.         label=gtk_label_new("输入消息:");
  152.         gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,5);

  153.         message_entry=gtk_entry_new();
  154.         gtk_box_pack_start(GTK_BOX(hbox),message_entry,FALSE,FALSE,5);

  155.         button=gtk_button_new_with_label("发送");
  156.         gtk_box_pack_start(GTK_BOX(hbox),button,FALSE,FALSE,5);
  157.         g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(on_send),NULL);

  158.         gtk_widget_show_all(window);

  159.         gdk_threads_enter();
  160.         gtk_main();
  161.         gdk_threads_leave();

  162.         return FALSE;
  163. }
复制代码
这个是与之对应的客户端程序,大家帮忙看下,谢谢,一个课程设计要急用,跪谢各位

论坛徽章:
0
2 [报告]
发表于 2014-05-16 14:54 |只看该作者
运行时总是显示thread not supported,我是初学linux网络编程,不知道那里除了问题,请教下各位,小弟感激不尽

论坛徽章:
0
3 [报告]
发表于 2014-05-17 15:02 |只看该作者
我的系统是fedota19

论坛徽章:
0
4 [报告]
发表于 2014-05-30 13:30 |只看该作者
       -pthread
           Adds support for multithreading with the pthreads library.  This
           option sets flags for both the preprocessor and linker.

试试看是不是在编译的时候,加上 -pthread
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP