红联Linux门户
Linux帮助

linux县城通信代码

发布时间:2011-07-24 19:13:18来源:红联作者:zhaohan1988
Gui.h

#ifndef _GTK_H
#define _GTK_H
#include
#include "struct.h"
enum
{
COLUMN,
COLUMN1,
NUM_COLS
} ;

GtkWidget *window_main;
// window_main = gtk_window_new(GTK_WINDOW_TOPLEVEL);
GtkWidget *view_main;
// vbox_main = gtk_vbox_new(FALSE, 2);
GtkTreeSelection *selection_main;
GtkWidget *vbox_main,*tool1_hbox,*menu_hbox,*tool2_vbox;
GtkWidget *statusbar_main;
// statusbar_main = gtk_statusbar_new();

GtkWidget *window_talk;
GtkWidget *mesg_send_button, *file_send_button, *close_button;
GtkWidget *toolbar, *toolbar_image;
//GtkWidget *font_select_button, *face_button, *font_color_button, *log_button;
GtkWidget *box, *vbox1, *vbox2, *hbox1, *hbox2, *hbox3, *hbox4, *hbox5, *hbox6, *hbox7;
GtkWidget *scrolled_window1, *scrolled_window2, *send_view, *recv_view;
GtkWidget *frame1, *frame2;
GtkTextBuffer *send_buffer,*recv_buffer;
GtkWidget *my_button,*menu_button,*you_button,*myself_button;
GtkWidget *MenuBar;
GtkWidget *MenuItemFile;
// gchar *image_bg="/images/background.jpg";

gchar *talk_name_current;
GtkWidget *edit_name,*edit_picture;
char font_send[20];

void GUI_Init(int *argc, char ***argv);
void GUI_Reflash_Online_List();
void GUI_Talk(struct System_Msg *msg);
void on_changed(GtkWidget *widget, gpointer statusbar);
static GtkTreeModel *create_and_fill_model ();
static GtkWidget *create_view_and_model ();
#endif


Gui.c

#include
#include "gui.h"

void ButtonEvent(GtkWidget *widget, gpointer *data)
{
;
}

//------------------------
//********字体类型*********//
void font_select(GtkWidget *widget,gpointer *data)
{
// char font_send[100];
GtkResponseType result;
/*建立FONT对话框*/
GtkWidget *dialog=gtk_font_selection_dialog_new("Select Font");
result=gtk_dialog_run(GTK_DIALOG(dialog));
//若点击确定,改变字体设置
if(result == GTK_RESPONSE_OK || result ==GTK_RESPONSE_APPLY)
{
PangoFontDescription *font_desc;
gchar *fontname=gtk_font_selection_dialog_get_font_name(GTK_FONT_SELECTION_DIALOG(dialog));
font_desc=pango_font_description_from_string(fontname);
memset(font_send,0,20);
strcpy(font_send,fontname);
g_print("%s\n",font_send);
gtk_widget_modify_font(GTK_WIDGET(send_view),font_desc);
g_free(fontname);
}

gtk_widget_destroy(dialog);
}

//********字体颜色*********//
void color_select(GtkWidget *widget,gpointer *data)
{
char color_send[100];
GtkResponseType result;
GtkColorSelection *colorsel;
GtkWidget *dialog = gtk_color_selection_dialog_new("Select Color");
result = gtk_dialog_run(GTK_DIALOG(dialog));
if(result == GTK_RESPONSE_OK)
{
GdkColor color;
colorsel = GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(dialog)->colorsel);
gtk_color_selection_get_current_color(colorsel, &color);
memset(color_send,0,100);
strcpy(color_send,GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(dialog)));
g_print("%s\n",color_send);
gtk_widget_modify_text(send_view,GTK_STATE_NORMAL,&color);
}
gtk_widget_destroy(dialog);
}

//*********表情**********//
//*********插入表情字符**********//

void face1_button_event(GtkWidget *widget,gpointer *data)
{

GtkTextIter show_start,show_end;
char *name="/1";
gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(send_buffer),&show_start,&show_end);
gtk_text_buffer_insert(GTK_TEXT_BUFFER(send_buffer),&show_end,name,strlen(name));
}

void face2_button_event(GtkWidget *widget,gpointer *data)
{
/*
//插入图片到文本框//
GError *error = NULL;
GdkPixbuf *pixbuf;
GtkTextMark *cursor;
GtkTextIter iter;

pixbuf = gdk_pixbuf_new_from_file ("./images/02.gif", &error);
cursor = gtk_text_buffer_get_insert (input_buffer);
gtk_text_buffer_get_iter_at_mark (input_buffer, &iter, cursor);
gtk_text_buffer_insert_pixbuf (input_buffer, &iter, pixbuf);
*/

GtkTextIter show_start,show_end;
char *name="/2";
gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(send_buffer),&show_start,&show_end);
gtk_text_buffer_insert(GTK_TEXT_BUFFER(send_buffer),&show_end,name,strlen(name));
}

void face3_button_event(GtkWidget *widget,gpointer *data)
{
GtkTextIter show_start,show_end;
char *name="/3";
gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(send_buffer),&show_start,&show_end);
gtk_text_buffer_insert(GTK_TEXT_BUFFER(send_buffer),&show_end,name,strlen(name));
}

void face4_button_event(GtkWidget *widget,gpointer *data)
{
GtkTextIter show_start,show_end;
char *name="/4";
gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(send_buffer),&show_start,&show_end);
gtk_text_buffer_insert(GTK_TEXT_BUFFER(send_buffer),&show_end,name,strlen(name));
}

void face_select(int argc,char *argv[])
{
gtk_init(&argc,&argv);

/*定义一个窗体变量 */
GtkWidget *facewindow;
/*定义三个按钮变量 */
GtkWidget *face1_button,*face2_button,*face3_button,*face4_button;
/*定义一个窗体变量 */
GtkWidget *facebox;
/*创建图片变量 */
GtkWidget *image1,*image2,*image3,*image4;
/*创建一个新视窗 */
facewindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
/*设置窗体标题 */
gtk_window_set_title(GTK_WINDOW(facewindow),"表情选择");
/*设置窗体位置 */
gtk_window_set_position(GTK_WINDOW(facewindow), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(facewindow),2,50);
/*按destroy退出按钮 */
g_signal_connect(GTK_OBJECT(facewindow),"destroy",GTK_SIGNAL_FUNC(gtk_main_quit),NULL);
/*创建窗口*/
facebox = gtk_hbox_new(FALSE,10);
/*创建按钮 */
face1_button = gtk_button_new();
face2_button = gtk_button_new();
face3_button = gtk_button_new();
face4_button = gtk_button_new();
gtk_signal_connect(GTK_OBJECT(face1_button),"clicked",G_CALLBACK(face1_button_event),NULL);
gtk_signal_connect(GTK_OBJECT(face2_button),"clicked",G_CALLBACK(face2_button_event),NULL);
gtk_signal_connect(GTK_OBJECT(face3_button),"clicked",G_CALLBACK(face3_button_event),NULL);
gtk_signal_connect(GTK_OBJECT(face4_button),"clicked",G_CALLBACK(face4_button_event),NULL);
/*图片保存路径 */
image1 = gtk_image_new_from_file("./images/face/images/01.gif");
image2 = gtk_image_new_from_file("./images/face/images/02.gif");
image3 = gtk_image_new_from_file("./images/face/images/03.gif");
image4 = gtk_image_new_from_file("./images/face/images/04.gif");

/*将图片插到按钮上*/

gtk_container_add(GTK_CONTAINER(face1_button),image1);
gtk_container_add(GTK_CONTAINER(face2_button),image2);
gtk_container_add(GTK_CONTAINER(face3_button),image3);
gtk_container_add(GTK_CONTAINER(face4_button),image4);

/*在facebox上添加按钮 */
gtk_box_pack_start(GTK_BOX(facebox),face1_button,FALSE,FALSE,1);
gtk_box_pack_start(GTK_BOX(facebox),face2_button,FALSE,FALSE,1);
gtk_box_pack_start(GTK_BOX(facebox),face3_button,FALSE,FALSE,1);
gtk_box_pack_start(GTK_BOX(facebox),face4_button,FALSE,FALSE,1);

/*在窗体上添加box*/
gtk_container_add(GTK_CONTAINER(facewindow),facebox);



/*显示窗体 */
gtk_widget_show_all(facewindow);
gtk_main();

}
//-----------------------------------
void info_button_ok()
{
char *buffer_name,*buffer_picture;
buffer_name = gtk_entry_get_text(edit_name);
buffer_picture = gtk_entry_get_text(edit_picture);
strcpy(online_user_list[0].name,buffer_name);
online_user_list[0].picture =buffer_picture[0];
g_print("%d change ok",online_user_list[0].picture);
}
void set_information(int argc,char *argv[])
{

GtkWidget *vbox,*hbox1,*hbox2,*hbox3;
GtkWidget *window_info;
// GtkWidget *edit_name,*edit_picture;
GtkWidget *button_ok,*button_close;
GtkWidget *lable_name,*lable_picture;

vbox=gtk_vbox_new(FALSE,0);
hbox1=gtk_hbox_new(FALSE,0);
hbox2=gtk_hbox_new(FALSE,0);
hbox3=gtk_hbox_new(FALSE,0);
lable_name = gtk_label_new("name: ");
lable_picture = gtk_label_new("picture:");
button_ok=gtk_button_new_with_label("OK");
button_close=gtk_button_new_with_label("CLOSE");
gtk_widget_set_size_request(button_ok,100,25);
gtk_widget_set_size_request(button_close,100,25);
edit_name = gtk_entry_new();
edit_picture = gtk_entry_new();
window_info=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_init(&argc,&argv);
gtk_window_set_position(GTK_WINDOW(window_info), GTK_WIN_POS_CENTER);
gtk_window_set_title(GTK_WINDOW(window_info), "persional information");
gtk_widget_set_size_request (window_info, 250, 100);

g_signal_connect(G_OBJECT(button_ok),"clicked",G_CALLBACK(info_button_ok),NULL);
gtk_box_pack_start(GTK_BOX(hbox1),lable_name,FALSE,FALSE,3);
gtk_box_pack_start(GTK_BOX(hbox1),edit_name,FALSE,FALSE,3);
gtk_box_pack_start(GTK_BOX(hbox2),lable_picture,FALSE,FALSE,3);
gtk_box_pack_start(GTK_BOX(hbox2),edit_picture,FALSE,FALSE,3);
gtk_box_pack_start(GTK_BOX(hbox3),button_ok,FALSE,FALSE,3);
gtk_box_pack_start(GTK_BOX(hbox3),button_close,FALSE,FALSE,3);
gtk_box_pack_start(GTK_BOX(vbox),hbox1,FALSE,FALSE,3);
gtk_box_pack_start(GTK_BOX(vbox),hbox2,FALSE,FALSE,3);
gtk_box_pack_start(GTK_BOX(vbox),hbox3,FALSE,FALSE,3);
gtk_container_add(GTK_CONTAINER(window_info), vbox);
// gtk_container_add(GTK_CONTAINER(window_info),calendar);
gtk_widget_show_all(window_info);
gtk_main();
}
void on_changed(GtkWidget *widget, gpointer statusbar)
{
GtkTreeIter iter;
GtkTreeModel *model;
char *value;


if (gtk_tree_selection_get_selected(
GTK_TREE_SELECTION(widget), &model, &iter)) {

gtk_tree_model_get(model, &iter, COLUMN, &value, -1);
gtk_statusbar_push(GTK_STATUSBAR(statusbar),
gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar),
value), value);
if((strcmp(value,"Friend List")) && (strcmp(value,"Black List")))
{
talk_name_current = value;
printf("you select :%s\n",talk_name_current);
gtk_widget_show_all(window_talk);
}
else
{
}
g_free(value);
}
}
static GtkTreeModel *
create_and_fill_model ()
{
int i = 0;
GtkTreeStore *treestore;
GtkTreeIter toplevel, child;

treestore = gtk_tree_store_new(NUM_COLS,
G_TYPE_STRING,G_TYPE_STRING);

gtk_tree_store_append(treestore, &toplevel, NULL);
gtk_tree_store_set(treestore, &toplevel,
COLUMN, "Friend List",COLUMN1,"",
-1);
for(i = 0;i < online_user_current;i++)
{
gtk_tree_store_append(treestore, &child, &toplevel);
gtk_tree_store_set(treestore, &child,
COLUMN, p_online_user_list[i].name,COLUMN1,p_online_user_list[i].ip,
-1);
}
gtk_tree_store_append(treestore, &toplevel, NULL);
gtk_tree_store_set(treestore, &toplevel,
COLUMN, "Black List",COLUMN1,"",
-1);

gtk_tree_store_append(treestore, &child, &toplevel);
gtk_tree_store_set(treestore, &child,
COLUMN, "Black1",COLUMN1,"0.0.0.0",
-1);

gtk_tree_store_append(treestore, &child, &toplevel);
gtk_tree_store_set(treestore, &child,
COLUMN, "Black2",COLUMN1,"0.0.0.0",
-1);

gtk_tree_store_append(treestore, &child, &toplevel);
gtk_tree_store_set(treestore, &child,
COLUMN, "Black3",COLUMN1,"0.0.0.0",
-1);

return GTK_TREE_MODEL(treestore);
}
static GtkWidget *
create_view_and_model ()
{
GtkTreeViewColumn *col_name;
GtkTreeViewColumn *col_ip;
GtkCellRenderer *renderer;
GtkWidget *view;
GtkTreeModel *model;

view = gtk_tree_view_new();

col_name = gtk_tree_view_column_new();
col_ip = gtk_tree_view_column_new();
gtk_tree_view_column_set_title(col_name, "Name");
gtk_tree_view_column_set_title(col_ip, "ip address");
gtk_tree_view_append_column(GTK_TREE_VIEW(view), col_name);
gtk_tree_view_append_column(GTK_TREE_VIEW(view), col_ip);

renderer = gtk_cell_renderer_text_new();
gtk_tree_view_column_pack_start(col_name, renderer, TRUE);
gtk_tree_view_column_add_attribute(col_name, renderer,
"text", COLUMN);
gtk_tree_view_column_pack_start(col_ip, renderer, TRUE);
gtk_tree_view_column_add_attribute(col_ip, renderer,
"text", COLUMN1);

model = create_and_fill_model(p_online_user_list);
gtk_tree_view_set_model(GTK_TREE_VIEW(view), model);
g_object_unref(model);
return view;
}
//-------------------------------lyl function
GtkWidget *CreateMenuItem(GtkWidget *MenuBar,char *test)
{
GtkWidget *MenuItem;
MenuItem=gtk_menu_item_new_with_label(test);
gtk_menu_shell_append(GTK_MENU_SHELL(MenuBar),MenuItem);
gtk_widget_show(MenuItem);
return MenuItem;
}
void quit_event();
void logout();
void Calendar1(GtkWidget *widget,gpointer data);
GtkWidget *CreateMenu(GtkWidget *MenuItem)
{

GtkWidget *MenuBar;
GtkWidget *Menu;
GtkWidget *EXIT;
GtkWidget *CALENDAR;
GtkWidget *REF;
Menu=gtk_menu_new();
CALENDAR=CreateMenuItem(Menu," Calendar ");

REF=CreateMenuItem(Menu," Reflash List ");
EXIT=CreateMenuItem(Menu," Exit ");
g_signal_connect(GTK_OBJECT(EXIT),"activate",G_CALLBACK(logout),NULL);
g_signal_connect(GTK_OBJECT(CALENDAR),"activate",G_CALLBACK(Calendar1),NULL);
g_signal_connect(GTK_OBJECT(REF),"activate",G_CALLBACK(GUI_Reflash_Online_List),NULL);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(MenuItem),Menu);
gtk_widget_show(Menu);
return 0;
}
/*自己头像设置*/
GtkWidget *xpm_label_box(gchar*xpm_filename,gchar *label_text)
{
GtkWidget *box;
GtkWidget *label;
GtkWidget *image_x;


box=gtk_hbox_new(FALSE,0);
gtk_container_set_border_width(GTK_CONTAINER(box),2);
image_x=gtk_image_new_from_file(xpm_filename);
label=gtk_label_new(label_text);
gtk_box_pack_start(GTK_BOX(box),image_x,FALSE,FALSE,3);
gtk_box_pack_start(GTK_BOX(box),label,FALSE,FALSE,3);
gtk_widget_show(image_x);
gtk_widget_show(label);
return box;
}
/*背景设置*/
void win_set_bg(GtkWidget *widget, gchar *img_file)
{
GtkStyle *style;
GdkPixbuf *pixbuf;
GdkPixmap *pixmap;
gint width,height;

pixbuf = gdk_pixbuf_new_from_file(img_file,NULL);
width = gdk_pixbuf_get_width(pixbuf);
height = gdk_pixbuf_get_height(pixbuf);
pixmap = gdk_pixmap_new(NULL,width,height,0);
gdk_pixbuf_render_pixmap_and_mask(pixbuf,&pixmap,NULL,129);
style= gtk_style_copy(GTK_WIDGET(widget)->style);
if(style->bg_pixmap[GTK_STATE_NORMAL])
g_object_unref(style->bg_pixmap[GTK_STATE_NORMAL]);
style->bg_pixmap[GTK_STATE_NORMAL]=g_object_ref(pixmap);
style->bg_pixmap[GTK_STATE_ACTIVE]=g_object_ref(pixmap);
style->bg_pixmap[GTK_STATE_PRELIGHT]=g_object_ref(pixmap);
style->bg_pixmap[GTK_STATE_SELECTED]=g_object_ref(pixmap);
style->bg_pixmap[GTK_STATE_INSENSITIVE]=g_object_ref(pixmap);

gtk_widget_set_style(GTK_WIDGET(widget),style);
g_object_unref(style);
}
void Calendar1(GtkWidget *widget,gpointer data)
{
GtkWidget *window1;
GtkWidget *calendar;
window1=gtk_window_new(GTK_WINDOW_TOPLEVEL);
calendar=gtk_calendar_new();
gtk_container_add(GTK_CONTAINER(window1),calendar);
gtk_widget_show(calendar);
gtk_widget_show(window1);
gtk_main();
}

//-------------------------------lyl function
//--------------talk function
void quit_event(GtkWidget *widget, gpointer data)
{
// g_print("你单极\n");
gtk_text_buffer_set_text(recv_buffer,"",-1);
gtk_widget_hide_all(window_talk);
}
void window_talk_init(GtkWidget *window_x)
{
g_signal_connect(G_OBJECT(window_x),"destroy",G_CALLBACK(quit_event),NULL);
gtk_window_set_title(GTK_WINDOW(window_x),"聊天");
//gtk_window_set_default_size(GTK_WINDOW(main_window),400,300);
gtk_container_set_border_width(GTK_CONTAINER(window_x), 5 );
}
void close_button_init(GtkWidget *close_button)
{
g_signal_connect(G_OBJECT(close_button),"clicked",G_CALLBACK(quit_event),NULL);

}
void send_event()
{
GtkTextIter start,end;
gchar *send_text,*recv_text;
GtkTextIter iter;
GError *error = NULL;
GdkPixbuf *pixbuf;
GtkTextMark *cursor;
send_buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(send_view));
gtk_text_buffer_get_start_iter(send_buffer,&start);
gtk_text_buffer_get_end_iter(send_buffer,&end);
send_text = gtk_text_buffer_get_text(send_buffer,&start,&end,TRUE);

recv_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(recv_view));
cursor = gtk_text_buffer_get_insert (recv_buffer);
gtk_text_buffer_get_iter_at_mark(recv_buffer,&iter,cursor);
gtk_text_buffer_insert(recv_buffer,&iter,"you said:",-1);
gtk_text_buffer_insert(recv_buffer,&iter,"\n",-1);

PangoFontDescription *font_desc;
font_desc=pango_font_description_from_string(font_send);
gtk_widget_modify_font(GTK_WIDGET(recv_view),font_desc);

if(!strcmp(send_text,"/1"))
{
pixbuf = gdk_pixbuf_new_from_file ("./images/face/images/01.gif", &error);
cursor = gtk_text_buffer_get_insert (recv_buffer);
gtk_text_buffer_get_iter_at_mark (recv_buffer, &iter, cursor);
gtk_text_buffer_insert_pixbuf (recv_buffer, &iter, pixbuf);
}
else if(!strcmp(send_text,"/2"))
{
pixbuf = gdk_pixbuf_new_from_file ("./images/face/images/02.gif", &error);
cursor = gtk_text_buffer_get_insert (recv_buffer);
gtk_text_buffer_get_iter_at_mark (recv_buffer, &iter, cursor);
gtk_text_buffer_insert_pixbuf (recv_buffer, &iter, pixbuf);
}
else if(!strcmp(send_text,"/3"))
{
pixbuf = gdk_pixbuf_new_from_file ("./images/face/images/03.gif", &error);
cursor = gtk_text_buffer_get_insert (recv_buffer);
gtk_text_buffer_get_iter_at_mark (recv_buffer, &iter, cursor);
gtk_text_buffer_insert_pixbuf (recv_buffer, &iter, pixbuf);
}
else if(!strcmp(send_text,"/4"))
{
pixbuf = gdk_pixbuf_new_from_file ("./images/face/images/04.gif", &error);
cursor = gtk_text_buffer_get_insert (recv_buffer);
gtk_text_buffer_get_iter_at_mark (recv_buffer, &iter, cursor);
gtk_text_buffer_insert_pixbuf (recv_buffer, &iter, pixbuf);
}
else if(!strcmp(send_text,"Y"))
{
gtk_text_buffer_insert(recv_buffer,&iter,"Y",-1);
gtk_text_buffer_insert(recv_buffer,&iter,"\n",-1);
gtk_text_buffer_insert(recv_buffer,&iter,"file_recieve_pthread start",-1);
gtk_text_buffer_insert(recv_buffer,&iter,"\n",-1);
sleep(2);
gtk_text_buffer_insert(recv_buffer,&iter,"recieve successed",-1);
gtk_text_buffer_insert(recv_buffer,&iter,"\n",-1);
}
else
{
gtk_text_buffer_insert(recv_buffer,&iter,send_text,-1);
}
gtk_text_buffer_insert(recv_buffer,&iter,"\n",-1);
// gtk_text_buffer_get_start_iter(recv_buffer,&start);
// gtk_text_buffer_get_end_iter(recv_buffer,&end);
// info = gtk_text_buffer_get_text(recv_buffer,&start,&end,TRUE);

// recv_text = info+ "\n" + send_text;
gtk_text_buffer_set_text(send_buffer,"",-1);

g_print("%s\n",send_text);
LinPop_Send_Talk_Msg(talk_name_current,send_text,font_send);
}
void add_text(char data)
{
GtkTextIter start,end;
gchar *send_text,*recv_text;
gchar *info;
send_buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(recv_view));
gtk_text_buffer_get_start_iter(recv_buffer,&start);
gtk_text_buffer_get_end_iter(recv_buffer,&end);
send_text = gtk_text_buffer_get_text(recv_buffer,&start,&end,TRUE);
recv_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(recv_view));
recv_text = send_text;
gtk_text_buffer_set_text(recv_buffer,recv_text,-1);
// g_print("%s\n",send_text);
// LinPop_Send_Talk_Msg(talk_name_current,send_text)
}
//--------------talk function
void logout()
{
LinPop_Send_Logout();
gtk_widget_destroy(GTK_WIDGET(window_main));
gtk_main_quit();
}
void file_send()
{
char *msg = "file_send";
LinPop_Send_Talk_Msg(talk_name_current,msg);
}
void GUI_Init(int *argc,char ***argv)
{
int i = 0;
gtk_init(argc, argv);
GtkWidget *image_head_main;
GtkWidget *image_head_talk1;
GtkWidget *image_head_talk2;
GtkWidget *head_label;
GtkWidget *edit_path;
window_main = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(window_main), GTK_WIN_POS_CENTER);
gtk_window_set_title(GTK_WINDOW(window_main), "Lin#");
gtk_widget_set_size_request (window_main, 225, 575);
image_head_main = gtk_image_new_from_file("./images/default.jpg");
vbox_main = gtk_vbox_new(FALSE, 10);
tool1_hbox = gtk_hbox_new(FALSE,10);
// tool2_vbox = gtk_vbox_new(FALSE,10);

my_button=gtk_button_new();
head_label = gtk_label_new("hi");
// my_button=xpm_label_box("/home/linpop/test2/all/images/head0.jpg","我的信息");
gtk_container_add(GTK_CONTAINER(my_button),image_head_main);
g_signal_connect(G_OBJECT(my_button),"clicked",G_CALLBACK(set_information),NULL);
gtk_widget_set_size_request(my_button,110,110);
MenuBar=gtk_menu_bar_new();
menu_hbox = gtk_hbox_new(FALSE,10);
MenuItemFile=CreateMenuItem(MenuBar," Menu ");
CreateMenu(MenuItemFile);
gtk_box_pack_start(GTK_BOX(menu_hbox),MenuBar,FALSE,TRUE,0);
gtk_box_pack_start(GTK_BOX(tool1_hbox),my_button,FALSE,FALSE,2);
gtk_box_pack_start(GTK_BOX(tool1_hbox),head_label,FALSE,FALSE,2);
win_set_bg(window_main,"./images/background.jpg");

view_main = create_view_and_model(p_online_user_list);
gtk_container_add(GTK_CONTAINER(window_main), vbox_main);
gtk_box_pack_start(GTK_BOX(vbox_main),tool1_hbox,FALSE,FALSE,2);
// gtk_box_pack_start(GTK_BOX(vbox_main),tool2_vbox,FALSE,FALSE,2);
gtk_box_pack_start(GTK_BOX(vbox_main), view_main, TRUE, TRUE, 1);
gtk_box_pack_end(GTK_BOX(vbox_main),menu_hbox,FALSE,FALSE,2);




selection_main = gtk_tree_view_get_selection(GTK_TREE_VIEW(view_main));



statusbar_main = gtk_statusbar_new();
// gtk_box_pack_start(GTK_BOX(vbox_main), statusbar_main, FALSE, TRUE, 1);

g_signal_connect(selection_main, "changed",
G_CALLBACK(on_changed), statusbar_main);

g_signal_connect (G_OBJECT (window_main), "destroy",
G_CALLBACK(logout), NULL);

gtk_widget_show_all(window_main);
printf("GUI INIT SUCCESS\n");
printf("DIAPLAY HOST NAME:");
printf("%s\n",p_online_user_list[i].name);
printf("REFLASH ONLINE LIST:\n");
for(i = 0;i < online_user_current;i++)
{
printf("name: %s | ",p_online_user_list[i].name);
printf("ip: %s | ",p_online_user_list[i].ip);
printf("picture: %d\n",p_online_user_list[i].picture);
}
//-----------------------talk
window_talk=gtk_window_new(GTK_WINDOW_TOPLEVEL);
window_talk_init(window_talk);
box=gtk_hbox_new(FALSE,0);
vbox1=gtk_vbox_new(FALSE,0);
vbox2=gtk_vbox_new(FALSE,0);

//消息发送按钮,关闭按钮
close_button=gtk_button_new_with_label(" 关闭 ");
close_button_init(close_button);
mesg_send_button=gtk_button_new_with_label(" 发送 ");
// close_button_init(mesg_send_button);
g_signal_connect(G_OBJECT(mesg_send_button),"clicked",G_CALLBACK(send_event),NULL);
hbox1=gtk_hbox_new(FALSE,5);
gtk_box_pack_end(GTK_BOX(hbox1), close_button, FALSE, FALSE, 5);
gtk_box_pack_end(GTK_BOX(hbox1), mesg_send_button, FALSE, FALSE, 5);

//消息输入框

scrolled_window1=gtk_scrolled_window_new(FALSE,FALSE);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window1),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
hbox2=gtk_hbox_new(FALSE,0);
gtk_box_pack_start(GTK_BOX(hbox2),scrolled_window1,FALSE,FALSE,5);
send_view=gtk_text_view_new();
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window1),send_view);
// send_buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(send_view));
gtk_widget_set_size_request(scrolled_window1,330,80);

/*

//字体,大小,表情,聊天记录按钮
font_select_button=gtk_button_new_with_label(" 字体 ");
close_button_init(font_select_button);
font_color_button=gtk_button_new_with_label(" 颜色 ");
close_button_init(font_color_button);
face_button=gtk_button_new_with_label(" 表情 ");
close_button_init(face_button);
log_button=gtk_button_new_with_label("聊天记录");
close_button_init(log_button);
hbox3=gtk_hbox_new(FALSE,10);
gtk_box_pack_start(GTK_BOX(hbox3), font_select_button, FALSE, FALSE,0);
gtk_box_pack_start(GTK_BOX(hbox3), font_color_button, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox3), face_button, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox3), log_button, FALSE, FALSE, 0);
*/
hbox3=gtk_vbox_new(FALSE,0);
toolbar=gtk_toolbar_new();

gtk_box_pack_start(GTK_BOX(hbox3), toolbar, FALSE, FALSE ,0);
toolbar_image=gtk_image_new_from_file("/home/linpop/test2/all/图标/2.jpg");
gtk_widget_set_size_request(toolbar_image,20,20);
gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), NULL, "字体", "Private",toolbar_image, GTK_SIGNAL_FUNC(font_select), NULL );
toolbar_image=gtk_image_new_from_file("./图标/3.jpg");
gtk_widget_set_size_request(toolbar_image,20,20);
gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), NULL, "颜色", "Private", toolbar_image, GTK_SIGNAL_FUNC(color_select), NULL );
toolbar_image=gtk_image_new_from_file("./图标/1.jpg");
gtk_widget_set_size_request(toolbar_image,20,20);
gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), NULL, "添加表情", "Private", toolbar_image, GTK_SIGNAL_FUNC(face_select), NULL );
toolbar_image=gtk_image_new_from_file("./图标/4.jpg");
gtk_widget_set_size_request(toolbar_image,20,20);
gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), NULL, "聊天记录", "Private", toolbar_image, GTK_SIGNAL_FUNC(ButtonEvent), NULL );
//gtk_container_set_border_width(GTK_CONTAINER(toolbar), 5);

//消息接收框
scrolled_window2=gtk_scrolled_window_new(FALSE,FALSE);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window2),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
hbox4=gtk_hbox_new(FALSE,0);
gtk_box_pack_start(GTK_BOX(hbox4),scrolled_window2,TRUE,TRUE,5);
recv_view=gtk_text_view_new();
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window2),recv_view);
recv_buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(recv_view));
gtk_text_view_set_editable(GTK_TEXT_VIEW(recv_view),FALSE);
gtk_widget_set_size_request(scrolled_window2,330,300);

//对方的信息
myself_button=gtk_button_new();
image_head_talk1 = gtk_image_new_from_file("./images/head1.jpg");
gtk_container_add(GTK_CONTAINER(myself_button),image_head_talk1);
frame1=gtk_frame_new(NULL);
hbox5=gtk_hbox_new(FALSE,0);
gtk_box_pack_end(GTK_BOX(hbox5), frame1, FALSE, FALSE, 10);
gtk_container_add(GTK_CONTAINER(frame1), myself_button);
gtk_frame_set_label(GTK_FRAME(frame1),"my information");
gtk_frame_set_label_align(GTK_FRAME(frame1),0.5,0.5);
gtk_frame_set_shadow_type(GTK_FRAME(frame1),GTK_SHADOW_ETCHED_OUT);
gtk_widget_set_size_request(frame1,130,170);

//我的信息
you_button=gtk_button_new();
image_head_talk2 = gtk_image_new_from_file("./images/head2.jpg");
gtk_container_add(GTK_CONTAINER(you_button),image_head_talk2);
frame2=gtk_frame_new(NULL);
hbox6=gtk_hbox_new(FALSE,0);
gtk_box_pack_end(GTK_BOX(hbox6), frame2, FALSE, FALSE, 10);
gtk_container_add(GTK_CONTAINER(frame2), you_button);
gtk_frame_set_label(GTK_FRAME(frame2),"his information");
gtk_frame_set_label_align(GTK_FRAME(frame2),0.5,0.5);
gtk_frame_set_shadow_type(GTK_FRAME(frame2),GTK_SHADOW_ETCHED_OUT);
gtk_widget_set_size_request(frame2,130,170);

//发送文件
edit_path = gtk_entry_new();
file_send_button=gtk_button_new_with_label(" 传送文件 ");
gtk_widget_set_size_request(file_send_button,130,50);
g_signal_connect(G_OBJECT(file_send_button),"clicked",G_CALLBACK(file_send),NULL);
hbox7=gtk_hbox_new(FALSE,10);
gtk_box_pack_start(GTK_BOX(hbox7), file_send_button, FALSE, FALSE,20);

gtk_box_pack_end(GTK_BOX(vbox1), hbox1, FALSE, FALSE, 5);
gtk_box_pack_end(GTK_BOX(vbox1), hbox2, FALSE, FALSE, 5);
gtk_box_pack_end(GTK_BOX(vbox1), hbox3, FALSE, FALSE, 0);
gtk_box_pack_end(GTK_BOX(vbox1), hbox4, FALSE, FALSE, 0);

gtk_box_pack_end(GTK_BOX(vbox2), hbox5, FALSE, FALSE, 0);
gtk_box_pack_end(GTK_BOX(vbox2), hbox6, FALSE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(vbox2), hbox7, FALSE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(vbox2), edit_path, FALSE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(box), vbox1, FALSE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(box), vbox2, FALSE, FALSE, 5);

gtk_container_add(GTK_CONTAINER(window_talk),box);
// gtk_widget_show_all(window_talk);
//-----------------------talk
gtk_main();
}
void GUI_Reflash_Online_List()
{
int i =0;
GtkWidget *image_head;
GtkWidget *head_label;
char path[40];
gtk_widget_destroy(GTK_WIDGET(vbox_main));
vbox_main = gtk_vbox_new(FALSE, 10);
tool1_hbox = gtk_hbox_new(FALSE,10);
switch(online_user_list[0].picture)
{
case 49: strcpy(path,"/home/linpop/test2/all/images/head1.jpg");break;
case 50: strcpy(path,"/home/linpop/test2/all/images/head2.jpg");break;
case 51: strcpy(path,"/home/linpop/test2/all/images/head3.jpg");break;
case 52: strcpy(path,"/home/linpop/test2/all/images/head4.jpg");break;
default:break;
}
// image_head = gtk_image_new_from_file("/home/linpop/test2/all/images/default.jpg");
image_head = gtk_image_new_from_file(path);


// image_head = gtk_image_new_from_file("/home/linpop/test2/all/images/head2.jpg");
// image_head = gtk_image_new_from_file("/home/linpop/test2/all/images/head0.jpg");
my_button=gtk_button_new();
head_label = gtk_label_new("hi");
gtk_label_set_text(head_label,online_user_list[0].name);
gtk_container_add(GTK_CONTAINER(my_button),image_head);
g_signal_connect(G_OBJECT(my_button),"clicked",G_CALLBACK(set_information),NULL);
gtk_widget_set_size_request(my_button,110,110);
MenuBar=gtk_menu_bar_new();
menu_hbox = gtk_hbox_new(FALSE,10);
MenuItemFile=CreateMenuItem(MenuBar," Menu ");
CreateMenu(MenuItemFile);
gtk_box_pack_start(GTK_BOX(menu_hbox),MenuBar,FALSE,TRUE,0);
gtk_box_pack_start(GTK_BOX(tool1_hbox),my_button,FALSE,FALSE,2);
gtk_box_pack_start(GTK_BOX(tool1_hbox),head_label,FALSE,FALSE,2);

view_main = create_view_and_model(p_online_user_list);
selection_main = gtk_tree_view_get_selection(GTK_TREE_VIEW(view_main));
gtk_container_add(GTK_CONTAINER(window_main), vbox_main);
gtk_box_pack_start(GTK_BOX(vbox_main),tool1_hbox,FALSE,FALSE,2);
gtk_box_pack_start(GTK_BOX(vbox_main), view_main, TRUE, TRUE, 1);
gtk_box_pack_end(GTK_BOX(vbox_main),menu_hbox,FALSE,FALSE,2);
// gtk_box_pack_start(GTK_BOX(vbox_main), view_main, TRUE, TRUE, 1);

statusbar_main = gtk_statusbar_new();
// gtk_box_pack_start(GTK_BOX(vbox_main), statusbar_main, FALSE, TRUE, 1);

g_signal_connect(selection_main, "changed",
G_CALLBACK(on_changed), statusbar_main);

g_signal_connect (G_OBJECT (window_main), "destroy",
G_CALLBACK(gtk_main_quit), NULL);

gtk_widget_show_all(window_main);

printf("GUI REFLASH ONLINE LIST SUCCESS\n");
printf("REFLASH ONLINE LIST:\n");
for(i = 0;i < online_user_current;i++)
{
printf("name: %s | ",p_online_user_list[i].name);
printf("ip: %s | ",p_online_user_list[i].ip);
printf("picture: %d\n",p_online_user_list[i].picture);
}
}
void msg_scan(char *msg)
{
char *p;
int index;
p = msg;
while(p != NULL)
{
if(*p = '/')
{
index = *(p+1);
}
}
}
void GUI_Talk(struct System_Msg *msg)
{
GtkTextIter start,end;
gchar *send_text,*recv_text;
GtkTextIter iter;

GError *error = NULL;
GdkPixbuf *pixbuf;
GtkTextMark *cursor;
// send_buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(send_view));
// gtk_text_buffer_get_start_iter(send_buffer,&start);
// gtk_text_buffer_get_end_iter(send_buffer,&end);
// send_text = gtk_text_buffer_get_text(send_buffer,&start,&end,TRUE);

recv_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(recv_view));
cursor = gtk_text_buffer_get_insert (recv_buffer);
gtk_text_buffer_get_iter_at_mark(recv_buffer,&iter,cursor);
gtk_text_buffer_insert(recv_buffer,&iter,msg->data1,-1);
gtk_text_buffer_insert(recv_buffer,&iter," said:",-1);
gtk_text_buffer_insert(recv_buffer,&iter,"\n",-1);

PangoFontDescription *font_desc;
font_desc=pango_font_description_from_string(msg->Talk_Data.font);
gtk_widget_modify_font(GTK_WIDGET(recv_view),font_desc);

if(!strcmp(msg->Talk_Data.data,"/1"))
{
pixbuf = gdk_pixbuf_new_from_file ("./images/face/images/01.gif", &error);
cursor = gtk_text_buffer_get_insert (recv_buffer);
gtk_text_buffer_get_iter_at_mark (recv_buffer, &iter, cursor);
gtk_text_buffer_insert_pixbuf (recv_buffer, &iter, pixbuf);
}
else if(!strcmp(msg->Talk_Data.data,"/2"))
{
pixbuf = gdk_pixbuf_new_from_file ("./images/face/images/02.gif", &error);
cursor = gtk_text_buffer_get_insert (recv_buffer);
gtk_text_buffer_get_iter_at_mark (recv_buffer, &iter, cursor);
gtk_text_buffer_insert_pixbuf (recv_buffer, &iter, pixbuf);
}
else if(!strcmp(msg->Talk_Data.data,"/3"))
{
pixbuf = gdk_pixbuf_new_from_file ("./images/face/images/03.gif", &error);
cursor = gtk_text_buffer_get_insert (recv_buffer);
gtk_text_buffer_get_iter_at_mark (recv_buffer, &iter, cursor);
gtk_text_buffer_insert_pixbuf (recv_buffer, &iter, pixbuf);
}
else if(!strcmp(msg->Talk_Data.data,"/4"))
{
pixbuf = gdk_pixbuf_new_from_file ("./images/face/images/04.gif", &error);
cursor = gtk_text_buffer_get_insert (recv_buffer);
gtk_text_buffer_get_iter_at_mark (recv_buffer, &iter, cursor);
gtk_text_buffer_insert_pixbuf (recv_buffer, &iter, pixbuf);
}
else if(!strcmp(msg->Talk_Data.data,"/5"))
{
pixbuf = gdk_pixbuf_new_from_file ("./images/face/images/05.gif", &error);
cursor = gtk_text_buffer_get_insert (recv_buffer);
gtk_text_buffer_get_iter_at_mark (recv_buffer, &iter, cursor);
gtk_text_buffer_insert_pixbuf (recv_buffer, &iter, pixbuf);
}
else if(!strcmp(msg->Talk_Data.data,"file_send"))
{
gtk_text_buffer_insert(recv_buffer,&iter,"user1 send a file to you:",-1);
gtk_text_buffer_insert(recv_buffer,&iter,"\n",-1);
gtk_text_buffer_insert(recv_buffer,&iter,"pass'Y'to recieve or 'N'to refuse",-1);
gtk_text_buffer_insert(recv_buffer,&iter,"\n",-1);
}
else
{
gtk_text_buffer_insert(recv_buffer,&iter,msg->Talk_Data.data,-1);
}
gtk_text_buffer_insert(recv_buffer,&iter,"\n",-1);
printf("GUI DESPLAY TALK SUCCESS\n");
printf("%s(%s)said: %s\n",msg->data1,msg->ip,msg->Talk_Data.data);
}


Include.h

#ifndef _INCLUDE_H
#define _INCLUDE_H

#include
#include
#include
#include
#include
#include "struct.h"


// struct OnlineUser online_user_list[ONLINE_USER_MAX]; //实例化上线用户结构体数?
// struct OnlineUser *p_online_user_list; //建立上线用户列表指针
struct System_Msg recieve_buf;
struct System_Msg *p_recieve_buf;
pthread_t receive_thread;

#endif

Linpop.c


//****************************************************************************************
//* 中间层 linpop.c 消息机制、数据处理实现。 *
//* 版本:2010年9月17日 2点53 *
//****************************************************************************************

#include "include.h"
#include "gui.h"
#include "socket.h"

//-----------------------------系统初始化----------------------------------------------------------------------------------------------------
void LinPop_Init() //系统初始化
{
// struct OnlineUser myself; //实例化当前用户信息
// strcpy(myself.ip,"127.0.0.1");
// strcpy(myself.name,"myself");
// myself.picture = 0;
Online_User_List_Init();
strcpy(online_user_list[0].ip,"192.168.1.3");
strcpy(online_user_list[0].name,"M-PC");
online_user_list[0].picture = 0;
// printf("%s",online_user_list[0].ip);
// printf("%s",online_user_list[0].name);
// printf("%d\n",online_user_list[0].picture);
p_online_user_list = online_user_list; //指针初始化

// online_user_list[0] = myself; //第一个上线的是自己
online_user_current = 1;
system_exit = 0;
p_recieve_buf = &recieve_buf;
}
//-----------------------------上线用户列表初始化------------------------------------------------------------------------------------------
void Online_User_List_Init()
{
int i = 0;
for(i = 0;i < ONLINE_USER_MAX;i++)
{
strcpy(online_user_list[i].ip,"0.0.0.0");
strcpy(online_user_list[i].name,"nobody");
online_user_list[i].picture = 0;
}
}
//-----------------------------用户上线信息发送给gui----------------------------------------------------------------------------------------
void LinPop_Login(struct System_Msg *msg) //增加在线用户
{
int temp;
if(online_user_current == ONLINE_USER_MAX)
{
//tell the client error
printf("CON'T LOGIN RESION FOR MAX USER\n");
}
else if(!LinPop_Name_Exist(msg->data1))
{
temp = LinPop_Add_Online_List(msg);
if(1 == temp)
{
online_user_current++;
}
GUI_Reflash_Online_List(p_online_user_list); //刷新上线列表
LinPop_Login_Radio();
}
}
//------------------------------在线用户列表中是否存在name-------------------------------------------------------------------------------
int LinPop_Name_Exist(char *name)
{
int i = 0;
for(i = 0;i < ONLINE_USER_MAX;i++)
{
if(!strcmp(name,online_user_list[i].name))
{
return 1;
}
}
return 0;
}
//------------------------------向用户列表中添加一个---------------------------------------------------------------------------------------
int LinPop_Add_Online_List(struct System_Msg *msg)
{
int i = 0;
for(i = 0;i < ONLINE_USER_MAX;i++)
{
if(!strcmp(online_user_list[i].name,"nobody"))
{
strcpy(online_user_list[i].ip,msg->ip);
strcpy(online_user_list[i].name,msg->data1);
online_user_list[i].picture = msg->data2;
return 1;
}
}
if((ONLINE_USER_MAX-1) == i)
{
return 0;
}
}
//------------------------------用户下线发送给gui--------------------------------------------------------------------------------------------
void LinPop_Logout(struct System_Msg *msg)
{
if(LinPop_Name_Exist(msg->data1))
{
LinPop_Del_Online_List(msg);
online_user_current--;
GUI_Reflash_Online_List(p_online_user_list); //刷新上线列表
}
else
{
//do nothing
}
}
//------------------------------下线信息广播发送---------------------------------------------------------------------------------------------
void LinPop_Send_Logout()
{
int flag = AGREEMENT_LOGOUT_FLAG;
char ip[20] = "255.255.255.255";
char data1[SYSTEM_MSG_LENGTH];
int data2;
struct System_Msg msg;
struct Talk_Msg talk_data;
struct Color col={100,101,102};

strcpy(data1,online_user_list[0].name);
data2 = 3;
strcpy(talk_data.font,"st");
talk_data.font_color = col;
talk_data.size = 12;
strcpy(talk_data.data,"i am canc");

Sys_Creat_Mesg(&msg,flag,ip,data1,data2,&talk_data);
System_Send(&msg);
printf("send logout ok\n");
}
//------------------------------从上线用户列表中删除制定名称的用户,其他顺序上移---------------------------------------------------------------
void LinPop_Del_Online_List(struct System_Msg *msg) //获取在线用户
{
int i = 0;
int flag = 0;
for(i = 0;i < ONLINE_USER_MAX;i++)
{
if(!strcmp(online_user_list[i].name,msg->data1))
{
flag =1;
}
if(1 == flag)
{
if(i == (ONLINE_USER_MAX-1))
{
strcpy(online_user_list[i].ip,"0.0.0.0");
strcpy(online_user_list[i].name,"nobody");
online_user_list[i].picture = 0;
}
else
{
online_user_list[i]=online_user_list[i+1];
}
}
}
}
//----------------------------------发送上线用户请求回复信息------------------------------------------------------------------------------------
void LinPop_Online_Reply(struct System_Msg *msg)
{
struct System_Msg send_msg;
// memset(&send_msg,0,sizeof(struct System_Msg));
send_msg.flag = AGREEMENT_ONLINE_REPLY_FLAG;
strcpy(send_msg.ip,msg->ip);
strcpy(send_msg.data1,online_user_list[0].name);
send_msg.data2 = online_user_list[0].picture;
LinPop_Send_Msg(&send_msg);
printf("send reply ok\n");
}
//----------------------------------发送上线用户请求信息---------------------------------------------------------------------------------
void LinPop_Online_Ask(void)
{
LinPop_Login_Radio1();
}
void LinPop_Send_Thread(struct System_Msg *msg);
//----------------------------------发送线程创建---------------------------------------------------------------------------------
void LinPop_Send_Msg(struct System_Msg *msg) //发送消息 用线程
{
pthread_t send_thread;
int temp;
if((temp = pthread_create(&send_thread,NULL,LinPop_Send_Thread,msg)) != 0)
{
//create fail
}
else
{
//create success
}
if(send_thread != 0)
{
pthread_join(send_thread,NULL);
//receive send end
}
}
//------------------------------------发送函数---------------------------------------------------------------------------------
void LinPop_Send_Thread(struct System_Msg *msg)
{
System_Send(msg);
pthread_exit(NULL);
}
//------------------------------------给gui传私聊消息-------------------------------------------------------------------------
void LinPop_Talk(struct System_Msg *msg)
{
if(LinPop_Name_Exist(msg->data1) && strcmp(msg->data1,online_user_list[0].name))
{
GUI_Talk(msg);
}
else
{
}
}
//------------------------------------接受函数------------------------------------------------------------------------------
void LinPop_Receive_Thread(void)
{
while(1)
{
System_Recieve(p_recieve_buf);
switch (p_recieve_buf->flag)
{
case AGREEMENT_DEFAULT_FLAG://0
break;
case AGREEMENT_LOGIN_FLAG://1
LinPop_Login(p_recieve_buf);break;
case AGREEMENT_LOGOUT_FLAG://2
LinPop_Logout(p_recieve_buf);break;
case AGREEMENT_ONLINE_ASK_FLAG://3
LinPop_Online_Reply(p_recieve_buf);break;
case AGREEMENT_ONLINE_REPLY_FLAG://4
LinPop_Login(p_recieve_buf);break;
case AGREEMENT_TALK_FLAG://5
LinPop_Talk(p_recieve_buf);break;
default:
//default
break;
}
if(1 == system_exit)
{
break;
}
}
System_Lose_Recv_Sockfd();
pthread_exit(NULL);
}
//------------------------------------接受线程创建--------------------------------------------------------------------------------
void LinPop_Receive_Thread_Create(void)
{
int temp;
if((temp = pthread_create(&receive_thread,NULL,LinPop_Receive_Thread,NULL)) != 0)
{
perror("create receive_thread fail");
}
else
{
//create success
}
}
void LinPop_Receive_Thread_Wait(void)
{
if(receive_thread != 0)
{
pthread_join(receive_thread,NULL);
//receive thread end
}
}
//------------------------------------发送广播下线信息---------------------------------------------------------------------------
void LinPop_Login_Radio()
{
int flag = AGREEMENT_LOGIN_FLAG;
char ip[20] = "255.255.255.255";
char data1[SYSTEM_MSG_LENGTH];
int data2;
struct System_Msg msg;
struct Talk_Msg talk_data;
struct Color col={100,101,102};

strcpy(data1,online_user_list[0].name);
data2 = 3;
strcpy(talk_data.font,"st");
talk_data.font_color = col;
talk_data.size = 12;
strcpy(talk_data.data,"i am canc");

Sys_Creat_Mesg(&msg,flag,ip,data1,data2,&talk_data);
System_Send(&msg);
}
//--------------------------------------发送广播上线信息---------------------------------------------------------------------
void LinPop_Login_Radio1()
{
int flag = AGREEMENT_ONLINE_ASK_FLAG;
char ip[20] = "255.255.255.255";
char data1[SYSTEM_MSG_LENGTH];
int data2;
struct System_Msg msg;
struct Talk_Msg talk_data;
struct Color col={100,101,102};

strcpy(data1,online_user_list[0].name);
data2 = 3;
strcpy(talk_data.font,"st");
talk_data.font_color = col;
talk_data.size = 12;
strcpy(talk_data.data,"i am canc");

Sys_Creat_Mesg(&msg,flag,ip,data1,data2,&talk_data);
System_Send(&msg);
}
//---------------------------------------从姓名获得用户id-----------------------------------------------------------------
int LinPop_Find_Ip_From_Name(char *name)
{
int i = 0;
for(i = 0;i < online_user_current;i++)
{
if(!strcmp(online_user_list[i].name,name))
{
return i;
}
}
}
//---------------------------------------私聊信息发送--------------------------------------------------------------------
void LinPop_Send_Talk_Msg(char *name,char *data,char *font)
{
// int name_num;
int flag = AGREEMENT_TALK_FLAG;
char ip[20] = "255.255.255.255";
char data1[SYSTEM_MSG_LENGTH];
int data2;
struct System_Msg msg;
struct Talk_Msg talk_data;
struct Color col={100,101,102};

// name_num = LinPop_Find_Ip_From_Name(name);
// printf("%dzzzz",name_num);
// strcpy(ip,online_user_list[name_num].ip);

printf("%s",ip);
strcpy(data1,online_user_list[0].name);
data2 = 3;
strcpy(talk_data.font,font);
talk_data.font_color = col;
talk_data.size = 12;
strcpy(talk_data.data,data);

Sys_Creat_Mesg(&msg,flag,ip,data1,data2,&talk_data);
System_Send(&msg);
}
//------------------------------------------入口函数------------------------------------------------------------------
int main(int argc, char **argv)
{
printf("linpop start\n");
LinPop_Init(&argc, &argv);
printf("linpop init ok\n"); //系统初始化
System_Socket_Init();
printf("system socket init ok\n");
LinPop_Receive_Thread_Create();
printf("linpop receive thread create ok\n");
LinPop_Login_Radio();
printf("send login radio ok\n");
LinPop_Login_Radio1();
printf("send ask radio ok\n");
printf("wait receive thread end...\n");

GUI_Init(&argc,&argv);
LinPop_Receive_Thread_Wait(); //图形界面初始化
return 0;
}


Socket.h

#ifndef _SOCKET_H
#define _SOCKET_H

#include
#include
#include
#include
#include
#include
#include "struct.h"


int recv_sockfd;
struct sockaddr_in recv_address;
int res;
int len;
struct sockaddr_in remote_address;

void System_Send(struct System_Msg *msg);
void System_Recieve(struct System_Msg *msg);
void System_Socket_Init(void);
void System_Lose_Recv_Sockfd();
void Sys_Creat_Mesg(struct System_Msg* buf,
int flag,
char ip[IP_LENGTH],
char data1[SYSTEM_MSG_LENGTH],
int data2,
struct Talk_Msg *Talk_Data
);
#endif
Socket.c

#include
#include "socket.h"


void System_Send(struct System_Msg *msg)
{
int send_sockfd;
struct sockaddr_in send_address;
int res;
int so_broadcast = 1;
send_address.sin_family = AF_INET;
send_address.sin_addr.s_addr = inet_addr(msg->ip);
send_address.sin_port = SOCKET_PORT;
if ((send_sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
perror("socket");
exit(EXIT_FAILURE);
}
if(!strcmp(msg->ip,"255.255.255.255"))
{
setsockopt(send_sockfd,SOL_SOCKET,SO_BROADCAST,&so_broadcast,sizeof(so_broadcast));
}
if ((res = sendto(send_sockfd,(struct System_Msg*)msg, sizeof(struct System_Msg), 0 , (struct sockaddr *)&send_address,sizeof(struct sockaddr))) < 0)
{
perror("sendto");
exit(EXIT_FAILURE);
}
close(send_sockfd);
}
void System_Recieve(struct System_Msg *msg)
{
struct System_Msg buf;
memset(&buf,0,sizeof(struct System_Msg));
len = sizeof(remote_address);
if ((res = recvfrom(recv_sockfd,(struct System_Msg*)&buf, sizeof(struct System_Msg), 0, (struct sockaddr *)&remote_address, &len)) <0 )
{
perror("recvfrom");
exit(EXIT_FAILURE);
}
strcpy(buf.ip,inet_ntoa(recv_address.sin_addr.s_addr));
if(msg != 0)
{
*msg = buf;
}
}
void System_Lose_Recv_Sockfd()
{
close(recv_sockfd);
}
void System_Socket_Init(void)
{
recv_address.sin_family = AF_INET;
recv_address.sin_addr.s_addr = htons(INADDR_ANY);
recv_address.sin_port = SOCKET_PORT;
if ((recv_sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
perror("socket");
exit(EXIT_FAILURE);
}
if (bind(recv_sockfd, (struct sockaddr *) &recv_address, sizeof(struct sockaddr) ) <0)
{
perror("bind");
exit(EXIT_FAILURE);
}

}
//创建消息函数
void Sys_Creat_Mesg(struct System_Msg* buf, //保存消息的缓存
int flag,
char ip[IP_LENGTH],
char data1[SYSTEM_MSG_LENGTH],
int data2,
struct Talk_Msg *Talk_Data
)
{
buf->flag=flag;
strcpy(buf->ip,ip);
strcpy(buf->data1,data1);
buf->data2 = data2;
strcpy(buf->Talk_Data.font,Talk_Data->font);
buf->Talk_Data.font_color.r=Talk_Data->font_color.r;
buf->Talk_Data.font_color.g=Talk_Data->font_color.g;
buf->Talk_Data.font_color.b=Talk_Data->font_color.b;
buf->Talk_Data.size = Talk_Data->size;
strcpy(buf->Talk_Data.data,Talk_Data->data);
}


Struct.h

#ifndef STRUCT_H
#define STRUCT_H

#define SOCKET_PORT 51889
#define TALK_MSG_LENGTH 1024
#define SYSTEM_MSG_LENGTH 10
#define IP_LENGTH 20
#define NAME_LENGTH 10
#define ONLINE_USER_MAX 20
#define AGREEMENT_DEFAULT_FLAG 0
#define AGREEMENT_LOGIN_FLAG 1
#define AGREEMENT_LOGOUT_FLAG 2
#define AGREEMENT_ONLINE_ASK_FLAG 3
#define AGREEMENT_ONLINE_REPLY_FLAG 4
#define AGREEMENT_TALK_FLAG 5

int online_user_current;
int system_exit;
//char talk_current_name;
struct OnlineUser //ÔÚÏßÓû§œá¹¹ÌåÊý×é
{
char name[NAME_LENGTH];
char ip[IP_LENGTH];
int picture;
} ;
struct Color
{
int r;
int g;
int b;
} ;
struct Talk_Msg
{
char font[20];
struct Color font_color;
int size;
char data[TALK_MSG_LENGTH];
} ;
struct System_Msg
{
int flag;
char ip[IP_LENGTH];
char data1[SYSTEM_MSG_LENGTH];
int data2;
struct Talk_Msg Talk_Data;
};
struct OnlineUser online_user_list[ONLINE_USER_MAX]; //ʵÀý»¯ÉÏÏßÓû§œá¹¹ÌåÊý×
struct OnlineUser *p_online_user_list; //œšÁ¢ÉÏÏßÓû§ÁбíÖžÕë
#endif



Makefile
# makefile linpop

all : linpop

linpop : linpop.o gtk.o socket.o
gcc -o main linpop.o gtk.o socket.o

linpop : linpop.c
gcc -c linpop.c

gtk.o : gtk.c
gcc -c gtk.c

socket.o : socket.c
gcc -c socket.c



很好用的代码
文章评论

共有 2 条评论

  1. zxx287856774 于 2011-07-25 19:35:07发表:

    :0wl;l1什麽叫?城(?程)通?代??

  2. sloepx 于 2011-07-25 08:51:41发表:

    严重学习