- 论坛徽章:
- 0
|
仿别人程序写的个程序如下,只能一个对一个,所以没有写serve,直接端对端通信,问题是老接不到发出去的消息,包括发给自己的。求大牛指导,万分感谢。代码如下:
- client.h
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <errno.h>
- #include <semaphore.h>
- #include <unistd.h>
- #include <pthread.h>
- #define PORT 8888
- sem_t send_sem;
- struct sockaddr_in my_addr;
- int sockfd;
- gchar *serv_IP;
- gchar *text;//要发送的文本
- gchar rec_text[1024];//接收到的文本
- GtkTextBuffer *show_buffer,*input_buffer;
- socklen_t len=sizeof(my_addr);
- void show_rec()
- {
- GtkTextIter start,end;
- gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(show_buffer),&start,&end);
- gtk_text_buffer_insert(GTK_TEXT_BUFFER(show_buffer),&end,"他说:\n",8);
- gtk_text_buffer_insert(GTK_TEXT_BUFFER(show_buffer),&end,rec_text,strlen(rec_text)-1);
- gtk_text_buffer_insert(GTK_TEXT_BUFFER(show_buffer),&end,"\n",1);
- }
- void *rec_func(void *arg)
- {
- while(1)
- {
- if(recvfrom(sockfd,rec_text,sizeof(rec_text),0,NULL,&len)<0)
- {
- perror("server recv error");
- exit(1);
- }
- fprintf(stdout,"他说 : %s \n",rec_text);
- }
- }
- void *sen_func(void *arg)
- {
-
- while(1)
- {
- sem_wait(&send_sem);
- if(sendto(sockfd,text,sizeof(text),0,(struct sockaddr*)&my_addr,len)==-1)
- {
- perror("S send error");
- exit(1);
- }
- }
- }
- void begin_serve()
- {
- gint res_t;
- pthread_t rec_pthread,sen_pthread;
- pthread_attr_t pthread_attr;
-
- if((res_t=sem_init(&send_sem,0,0))==-1)
- {
- perror("Semaphore init error");
- exit(EXIT_FAILURE);
- }
- if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1)
- {
- perror("Socket Error");
- exit(EXIT_FAILURE);
- }
-
- bzero(&my_addr,sizeof(my_addr));
- my_addr.sin_family=AF_INET;
- my_addr.sin_port=htons(PORT);
-
- if(inet_pton(AF_INET,serv_IP,&my_addr.sin_addr)<=0)
- {
- fprintf(stderr,"IP error\n");
- exit(1);
- }
- if((res_t=pthread_attr_init(&pthread_attr))==-1)
- {
- perror("Initiating pthread failed");
- exit(EXIT_FAILURE);
- }
- if((res_t=pthread_attr_setdetachstate(&pthread_attr,PTHREAD_CREATE_DETACHED))==-1)
- {
- perror("Setting detached attribute failed");
- exit(EXIT_FAILURE);
- }
-
- if((res_t=pthread_create(&sen_pthread,&pthread_attr,sen_func,NULL))==-1)
- {
- perror("Creating sen_pthread error");
- exit(EXIT_FAILURE);
- }
- if((res_t=pthread_create(&rec_pthread,&pthread_attr,rec_func,NULL))==-1)
- {
- perror("Creating rec_pthread error");
- exit(EXIT_FAILURE);
- }
- pthread_attr_destroy(&pthread_attr);
- }
- 以下大部分为GTK的东西,没有什么问题
- #include <gtk/gtk.h>
- #include "client.h"
- void quit_win(GtkWidget *window,gpointer *data)
- {
- gtk_main_quit();
- }
- void show_text(const gchar* text)
- {
- GtkTextIter start,end;
- gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(show_buffer),&start,&end);
- gtk_text_buffer_insert(GTK_TEXT_BUFFER(show_buffer),&end,"锤锤爷说:\n",13);
- gtk_text_buffer_insert(GTK_TEXT_BUFFER(show_buffer),&end,text,strlen(text));
- gtk_text_buffer_insert(GTK_TEXT_BUFFER(show_buffer),&end,"\n",1);
- }
- void get_IP_func(GtkWidget *widget,gpointer IP_text)
- {
- GtkTextIter start,end;
- serv_IP=(gchar *)gtk_entry_get_text(GTK_ENTRY((GtkWidget *)IP_text));//获得IP地址
- gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(show_buffer),&start,&end);
- gtk_text_buffer_insert(GTK_TEXT_BUFFER(show_buffer),&end,"连接成功... \n",17);
- begin_serve();
- }
- void send_func(GtkWidget *widget,gpointer *data)
- {
- sem_post(&send_sem);
- GtkTextIter start,end;
- gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(input_buffer),&start,&end);
- text=(char *)gtk_text_buffer_get_text(GTK_TEXT_BUFFER(input_buffer),&start,&end,FALSE);
- gtk_text_buffer_delete(GTK_TEXT_BUFFER(input_buffer),&start,&end);
- show_text(text);
- }
- void clean_func(GtkWidget *widget,gpointer *data)
- {
- GtkTextIter start,end;
- gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(show_buffer),&start,&end);
- gtk_text_buffer_delete(GTK_TEXT_BUFFER(show_buffer),&start,&end);
- }
- gint main(gint argc,gchar **argv)
- {
- GtkWidget *window;
- GtkWidget *scroll_1,*scroll_2;
- GtkWidget *send_button,*clean_button,*quit_button,*link_button;
- GtkWidget *IP_text,*input_text,*show_text;
- GtkWidget *IP_label,*space_label;
- GtkWidget *vbox,*hbox;
-
-
- gtk_init(&argc,&argv);
-
- window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_window_set_title(GTK_WINDOW(window),"juffun-Chat");
- gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
- gtk_window_set_default_size(GTK_WINDOW(window),450,360);
-
-
- send_button=gtk_button_new_with_label("发送");
- link_button=gtk_button_new_with_label("连接");
- clean_button=gtk_button_new_with_label("清空");
- quit_button=gtk_button_new_with_label("关闭");
- IP_label=gtk_label_new("IP地址:");
- space_label=gtk_label_new("");
-
- IP_text=gtk_entry_new_with_max_length(16);
- show_text=gtk_text_view_new();
- input_text=gtk_text_view_new();
- show_buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(show_text));
- input_buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(input_text));
-
- gtk_text_view_set_editable(GTK_TEXT_VIEW(show_text),FALSE);
-
- scroll_1=gtk_scrolled_window_new(NULL,NULL);
- scroll_2=gtk_scrolled_window_new(NULL,NULL);
- gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scroll_1),show_text);
- gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scroll_2),input_text);
-
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_1),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_2),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
-
- vbox=gtk_vbox_new(FALSE,0);
- hbox=gtk_hbox_new(FALSE,0);
-
- gtk_container_add(GTK_CONTAINER(window),vbox);
- gtk_box_pack_start(GTK_BOX(vbox),scroll_1,TRUE,TRUE,8);
- gtk_box_pack_start(GTK_BOX(vbox),scroll_2,FALSE,FALSE,2);
- gtk_box_pack_start(GTK_BOX(hbox),IP_label,FALSE,FALSE,2);
- gtk_box_pack_start(GTK_BOX(hbox),IP_text,FALSE,FALSE,2);
- gtk_box_pack_start(GTK_BOX(hbox),link_button,FALSE,FALSE,2);
- gtk_box_pack_start(GTK_BOX(hbox),space_label,TRUE,TRUE,0);
- gtk_box_pack_start(GTK_BOX(hbox),clean_button,FALSE,FALSE,2);
- gtk_box_pack_start(GTK_BOX(hbox),send_button,FALSE,FALSE,2);
- gtk_box_pack_start(GTK_BOX(hbox),quit_button,FALSE,FALSE,2);
- gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,2);
-
- g_signal_connect(GTK_OBJECT(window),"destroy",GTK_SIGNAL_FUNC(quit_win),NULL);
- g_signal_connect(GTK_OBJECT(link_button),"clicked",GTK_SIGNAL_FUNC(get_IP_func),IP_text);
- g_signal_connect(GTK_OBJECT(clean_button),"clicked",GTK_SIGNAL_FUNC(clean_func),NULL);
- g_signal_connect(GTK_OBJECT(send_button),"clicked",GTK_SIGNAL_FUNC(send_func),NULL);
- g_signal_connect(GTK_OBJECT(quit_button),"clicked",GTK_SIGNAL_FUNC(quit_win),NULL);
-
- gtk_widget_show_all(window);
- gtk_main();
- return 0;
-
- }
复制代码
[ 本帖最后由 juffun 于 2008-7-10 22:54 编辑 ] |
|