- 论坛徽章:
- 0
|
本帖最后由 mybooks_zzz 于 2014-05-17 07:58 编辑
- #include<glib.h>
- #include<stdio.h>
- #include<fcntl.h>
- #include<signal.h>
- #include<sys/socket.h>
- #include<sys/types.h>
- #include<sys/time.h>
- #include<unistd.h>
- #include<netdb.h>
- #include<netinet/in.h>
- #define OURPORT 8088
- #define MAX_USERS 8
- struct _client{
- gint sd;
- gboolean in_use;
- gchar name[64];
- gchar buf[1024];
- };
- typedef struct _client client;
- client user[MAX_USERS];
- void do_service(gpointer id)
- {
- gint j;
- char tobuf[1024];
- while(read(user[GPOINTER_TO_INT(id)].sd,user[GPOINTER_TO_INT(id)].buf,1024)!= -1)
- {
- sprintf(tobuf,"%s:%s\n",user[GPOINTER_TO_INT(id)].name,user[GPOINTER_TO_INT(id)].buf);
- for(j= 0;j<MAX_USERS;j++)
- {
- if(user[j].in_use)
- {
- write(user[j].sd,tobuf,1024);
- g_print("%s",tobuf);
- }
- }
- }
- user[GPOINTER_TO_INT(id)].in_use=FALSE;
- close(user[GPOINTER_TO_INT(id)].sd);
- }
- int main(int argc,char *argv[])
- {
- gint sd,newsd;
- struct sockaddr_in *sin;
- gint slen;
- gint count= 0;
- gint flags;
- gchar buf[1024];
- gchar tobuf[1024];
- gint length,i,j;
-
- if(!g_thread_supported())
- g_thread_init(NULL);
- else
- g_print("thread not supported\n");
- sd= socket(AF_INET,SOCK_STREAM,0);
- if(sd== -1)
- {
- g_print("create socket error!\n");
- return -1;
- }
- sin= g_new(struct sockaddr_in,1);
- sin->sin_family=AF_INET;
- sin->sin_port=OURPORT;
- slen=sizeof(struct sockaddr_in);
-
- if(bind(sd,sin,slen)< 0)
- {
- g_print("bind erro!\n");
- return -1;
- }
- if(listen(sd,8)<0)
- {
- g_print("listen error!\n");
- return -1;
- }
- for(i=0;i<MAX_USERS;i++)
- user[i].in_use=FALSE;
- flags= fcntl(sd,F_GETFL);
- fcntl(sd,F_SETFL,flags&~O_NDELAY);
- for(;;)
- {
- newsd=accept(sd,sin,&slen);
- if(newsd== -1)
- {
- g_print("accept error!\n");
- break;
- }
- else
- {
- if(count>=MAX_USERS)
- {
- sprintf(buf,"用户数量过多服务器不能连接。\n");
- write(newsd,buf,1024);
- close(newsd);
- }
- else
- {
- flags = fcntl(user[i].sd,F_GETFL);
- fcntl(user[i].sd,F_SETFL,O_NONBLOCK);
- user[count].sd=newsd;
- user[count].in_use=TRUE;
- read(newsd,user[count].name,64);
- g_thread_create((GThreadFunc)do_service,(gpointer)count,TRUE,NULL);
- count++;
- }
- }
- }
- close(sd);
- g_free(sin);
- }
复制代码 运行起来总是显示thread not supported。我的编译命令时gcc -o server server.c `pkg-config --cflags --libs gtk+-2.0 gthread-2.0`- #include<gtk/gtk.h>
- #include<string.h>
- #include<sys/types.h>
- #include<sys/socket.h>
- #include<netinet/in.h>
- #define OURPORT 8088
- gint sd;
- struct sockaddr_in s_in;
- gchar username[64];
- gchar buf[1024];
- gchar get_buf[1048];
- gboolean isconnected = FALSE;
- static GtkWidget *text;
- static GtkTextBuffer *buffer;
- static GtkWidget *message_entry;
- static GtkWidget *name_entry;
- static GtkWidget *login_button;
- void get_message(void)
- {
- GtkTextIter iter;
- gchar get_buf[1024];
- gchar buf[1024];
- while(read(sd,buf,1024)!= -1)
- {
- sprintf(get_buf,"%s",buf);
- gdk_threads_enter();
- gtk_text_buffer_get_end_iter(buffer,&iter);
- gtk_text_buffer_insert(buffer,&iter,get_buf,-1);
- gdk_threads_leave();
- }
- }
- void on_destroy(GtkWidget *widget,GdkEvent *event,gpointer data)
- {
- sprintf(username,"guest");
- if(do_connect()== TRUE)
- {
- gtk_widget_set_sensitive(login_button,FALSE);
- g_thread_create((GThreadFunc)get_message,NULL,FALSE,NULL);
- }
- gtk_widget_destroy(widget);
- }
- void on_button_clicked(GtkButton *button,gpointer data)
- {
- const gchar *name;
- name=gtk_entry_get_text(GTK_ENTRY(name_entry));
- sprintf(username,"%s",name);
- if(do_connect())
- {
- gtk_widget_set_sensitive(login_button,FALSE);
- g_thread_create((GThreadFunc)get_message,NULL,FALSE,NULL);
- }
- gtk_widget_destroy(data);
- }
- void create_win(void)
- {
- GtkWidget *win,*vbox;
- GtkWidget *button;
- win=gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_window_set_title(GTK_WINDOW(win),"输入用户名");
- gtk_container_set_border_width(GTK_CONTAINER(win),10);
- g_signal_connect(G_OBJECT(win),"delete_event",G_CALLBACK(on_destroy),NULL);
- gtk_window_set_modal(GTK_WINDOW(win),TRUE);
- gtk_window_set_position(GTK_WINDOW(win),GTK_WIN_POS_CENTER);
- vbox=gtk_vbox_new(FALSE,0);
- gtk_container_add(GTK_CONTAINER(win),vbox);
-
- name_entry=gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(vbox),name_entry,TRUE,TRUE,5);
- button=gtk_button_new_from_stock(GTK_STOCK_OK);
- g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(on_button_clicked),win);
- gtk_box_pack_start(GTK_BOX(vbox),button,FALSE,FALSE,5);
- gtk_widget_show_all(win);
- }
- gboolean do_connect(void)
- {
- GtkTextIter iter;
- gint slen;
- sd=socket(AF_INET,SOCK_STREAM,0);
- if(sd<0)
- {
- gtk_text_buffer_get_end_iter(buffer,&iter);
- gtk_text_buffer_insert(buffer,&iter,"打开套接字时出错!\n",-1);
- return FALSE;
- }
- s_in.sin_family=AF_INET;
- s_in.sin_port=OURPORT;
- slen=sizeof(s_in);
- if(connect(sd,&s_in,slen)<0)
- {
- gtk_text_buffer_get_end_iter(buffer,&iter);
- gtk_text_buffer_insert(buffer,&iter,"连接服务器时出错!\n",-1);
- return FALSE;
- }
- else
- {
- gtk_text_buffer_get_end_iter(buffer,&iter);
- gtk_text_buffer_insert(buffer,&iter,username,-1);
- gtk_text_buffer_get_end_iter(buffer,&iter);
- gtk_text_buffer_insert(buffer,&iter,"\n成功与服务器连接。。。\n",-1);
- write(sd,username,64);
- isconnected=TRUE;
- return TRUE;
- }
- }
- void on_send(GtkButton *button,gpointer data)
- {
- const char *message;
- if(isconnected==FALSE) return;
- message= gtk_entry_get_text(GTK_ENTRY(message_entry));
- sprintf(buf,"%s\n",message);
- write(sd,buf,1024);
- gtk_entry_set_text(GTK_ENTRY(message_entry),"");
- }
- void on_login(GtkWidget *button,gpointer data)
- {
- create_win;
- }
- void on_delete_event(GtkWidget *widget,GdkEvent *event,gpointer data)
- {
- close(sd);
- gtk_main_quit();
- }
- int main(int argc,char *argv[])
- {
- GtkWidget *window;
- GtkWidget *vbox,*hbox,*button,*label,*view;
- if(!g_thread_supported())
- g_thread_init(NULL);
- gtk_init(&argc,&argv);
- window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_window_set_title(GTK_WINDOW(window),"客户端");
- g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(on_delete_event),NULL);
- gtk_container_set_border_width(GTK_CONTAINER(window),10);
- vbox=gtk_vbox_new(FALSE,0);
- gtk_container_add(GTK_CONTAINER(window),vbox);
- hbox=gtk_hbox_new(FALSE,0);
- gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,5);
- label=gtk_label_new("点击登陆按钮连接服务器");
- gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,5);
- login_button=gtk_button_new_with_label("登录");
- gtk_box_pack_start(GTK_BOX(hbox),login_button,FALSE,FALSE,5);
- g_signal_connect(G_OBJECT(login_button),"clicked",G_CALLBACK(on_login),NULL);
- view=gtk_scrolled_window_new(NULL,NULL);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(view),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
- text=gtk_text_view_new();
- gtk_box_pack_start(GTK_BOX(vbox),view,TRUE,TRUE,5);
- gtk_container_add(GTK_CONTAINER(view),text);
- buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(text));
- hbox=gtk_hbox_new(FALSE,0);
- gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,5);
- label=gtk_label_new("输入消息:");
- gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,5);
- message_entry=gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(hbox),message_entry,FALSE,FALSE,5);
- button=gtk_button_new_with_label("发送");
- gtk_box_pack_start(GTK_BOX(hbox),button,FALSE,FALSE,5);
- g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(on_send),NULL);
- gtk_widget_show_all(window);
- gdk_threads_enter();
- gtk_main();
- gdk_threads_leave();
- return FALSE;
- }
复制代码 这个是与之对应的客户端程序,大家帮忙看下,谢谢,一个课程设计要急用,跪谢各位 |
|