亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 34971 | 回復(fù): 3
打印 上一主題 下一主題

C/S模式的GTK聊天程序,C語言編寫,運(yùn)行不出結(jié)果,跪求指教~~ [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2014-05-16 14:51 |只看該作者 |倒序?yàn)g覽
本帖最后由 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,"用戶數(shù)量過多服務(wù)器不能連接。\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. }
復(fù)制代碼
運(yùn)行起來總是顯示thread not supported。我的編譯命令時(shí)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,"打開套接字時(shí)出錯(cuò)!\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,"連接服務(wù)器時(shí)出錯(cuò)!\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成功與服務(wù)器連接。。。\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("點(diǎn)擊登陸按鈕連接服務(wù)器");
  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("發(fā)送");
  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. }
復(fù)制代碼
這個(gè)是與之對應(yīng)的客戶端程序,大家?guī)兔聪,謝謝,一個(gè)課程設(shè)計(jì)要急用,跪謝各位

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2014-05-16 14:54 |只看該作者
運(yùn)行時(shí)總是顯示thread not supported,我是初學(xué)linux網(wǎng)絡(luò)編程,不知道那里除了問題,請教下各位,小弟感激不盡

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2014-05-17 15:02 |只看該作者
我的系統(tǒng)是fedota19

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2014-05-30 13:30 |只看該作者
       -pthread
           Adds support for multithreading with the pthreads library.  This
           option sets flags for both the preprocessor and linker.

試試看是不是在編譯的時(shí)候,加上 -pthread
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP