大神 求帮忙 一个点到点的聊天程序 用UDP GTK写的 但是创建线程就端错误

daih_feng 2013-04-19 07:46:35
1 #include <gtk/gtk.h>
2 #include <string.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <sys/types.h>
6 #include <sys/socket.h>
7 #include <netinet/in.h>
8 #include <arpa/inet.h>
9 #include <unistd.h>
10 #include <pthread.h>
11
12 GtkTextBuffer *show_buffer, *input_buffer;
13 GtkTextBuffer *showbuffer;
14 int succeed = 0;
15
16 const gchar *ip_text, *port_text;
17 void get_ip(GtkWidget *ip_button, gpointer data)
18 {
19 ip_text = gtk_entry_get_text(GTK_ENTRY(data));
20 }
21
22 void get_port(GtkWidget *port_button, gpointer data)
23 {
24 port_text = gtk_entry_get_text(GTK_ENTRY(data));
25 }
26
27 void quit_win(GtkWidget *window, gpointer data)
28 {
29 gtk_main_quit();
30 }
31
32 void show_err(char *err)
33 {
34 GtkTextIter start, end;
35 gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(show_buffer), &start, &end);
36 gtk_text_buffer_insert(GTK_TEXT_BUFFER(show_buffer), &end, err,strlen(err));
37 }
38
39 void show_local_text(const gchar *text)//显示自己发送内容
40 {
41 GtkTextIter start, end;
42 gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(show_buffer), &start, &end);//获取当前缓存区位置
并保存到start,end位置结构中
43 gtk_text_buffer_insert(GTK_TEXT_BUFFER(show_buffer), &end, "I said:\n",8);
44 gtk_text_buffer_insert(GTK_TEXT_BUFFER(show_buffer), &end, text, strlen(text));
45 gtk_text_buffer_insert(GTK_TEXT_BUFFER(show_buffer), &end, "\n", 1);
46 }
47
48 void show_other_text(const gchar *text) //显示收到的内容
49 {
50 GtkTextIter start, end;
51 gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(show_buffer), &start, &end);
52 gtk_text_buffer_insert(GTK_TEXT_BUFFER(show_buffer), &end, "He said:\n",8);

52 gtk_text_buffer_insert(GTK_TEXT_BUFFER(show_buffer), &end, "He said:\n",8);
53 gtk_text_buffer_insert(GTK_TEXT_BUFFER(show_buffer), &end, text, strlen(text));
54 gtk_text_buffer_insert(GTK_TEXT_BUFFER(show_buffer), &end, "\n", 1);
55 }
56
57 void *recv_func(void *arg)
58 {
59 int server_sockfd, client_sockfd;
60 int server_len, client_len, ret;
61 struct sockaddr_in server_addr;
62 struct sockaddr_in client_addr;
63
64 server_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
65 if(server_sockfd == -1)
66 show_err("creat recv socket failed");
67
68 server_addr.sin_family = AF_INET;
69 server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
70 server_addr.sin_port = htons(atoi(port_text));
71
72 server_len = sizeof(server_addr);
73 client_len = sizeof(client_addr);
74
75 ret = bind(server_sockfd, ( const struct sockaddr *)&server_addr, server_len);
76 if( ret == -1)

77 show_err("server bind failed");
78 // struct timeval tv_out;
79 // tv_out.tv_sec = 2;
80 // tv_out.tv_usec = 0;
81 // setsockopt(server_sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv_out, sizeof(tv_out));
82 while(1)
83 {
84 gchar *recv_text = malloc(1024);
85 memset(recv_text, 0, 1024);
86
87 ret = recvfrom(server_sockfd, recv_text, 1024, 0 , (struct sockaddr *)&client_addr, &cl ient_len);
88 if( ret <= 0)
89 {
90 free(recv_text);
91 printf("i am recv_func\n");
92 // continue;
93 }
94 else
95 {
96 //show_other_text(recv_text);
97 printf("i had recv\n");
98 free(recv_text);
99 }
100 }
101 }
102 void clean_send_text()//清除输入文本
103 {
104 GtkTextIter start, end;
105 gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(input_buffer), &start, &end);
106 gtk_text_buffer_delete(GTK_TEXT_BUFFER(input_buffer), &start, &end);
107 }
108
109 void send_func(gchar *text)
110 {
111 int sockfd, len, ret;
112 struct sockaddr_in addr;
113
114 sockfd = socket(AF_INET, SOCK_DGRAM, 0);
115 if(sockfd == -1)
116 {
117 succeed = -1;
118 show_err("creat send socket failed");
119 }
120 addr.sin_family = AF_INET;
121 addr.sin_addr.s_addr = inet_addr(ip_text);
122 addr.sin_port = htons(atoi(port_text));
123 printf("ip:%s\tport:%s\n", ip_text, port_text);
124 len = sizeof(addr);
125 ret = sendto(sockfd, text, strlen(text), 0, (const struct sockaddr *)&addr, len);
126 if(ret>0)
127 printf("%d bytes sended", ret);
128 printf("i am send_func sended\n");
129 close(sockfd);
130 }
131
132 void send_text()//获得输入文本,并将其发送
133 {
134 GtkTextIter start, end;
135 gchar *text;
136 if(succeed == -1)
137 show_err("not connecting.....\n");
138 if(ip_text == NULL)
139 show_err("please input send_to_ip.....\n");
140 if(port_text == NULL)
141 show_err("please input port.....\n");
142 else
143 {
144 text = (gchar *)malloc(1024);
145 gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(input_buffer), &start,&end);
146 text = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(input_buffer), &start,&end,FALSE);
147 if(strcmp(text,"") != 0)
148 {
149 send_func(text);//发送文本
150 clean_send_text();//清除输入区内容
151 //printf("0\n");

152 show_local_text(text);//显示输入文本
153 }
154 else
155 show_err("输入不能为空\n");
156 free(text);
157 }
158 }
159 void log_in(GtkWidget *button, gpointer data)//窗口初始化
160 {
161 GtkWidget *window;
162 GtkWidget *show_text, *input_text;//定义两个文本框变量
163 GtkWidget *send_button, *close_button;//两个按钮变量
164 GtkWidget *hbox1, *hbox2, *hbox3, *vbox;//
165 GtkWidget *scrolled1, *scrolled2;//创建两个滚动条
166 GtkWidget *ip_label, *port_label;
167 GtkWidget *ip_entry, *port_entry;
168
169 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
170 gtk_window_set_title(GTK_WINDOW(window), "chatting");
171 gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
172 gtk_window_set_default_size(GTK_WINDOW(window), 430, 320);
173
174 g_signal_connect(GTK_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL);
175
176 send_button = gtk_button_new_with_label("发送");
177 close_button = gtk_button_new_with_label("关闭");
178 show_text = gtk_text_view_new(); //设置文本框

179 input_text = gtk_text_view_new();//设置文本框
180
181 ip_label = gtk_label_new("发送到IP:");
182 port_label = gtk_label_new("端口:");
183
184 ip_entry = gtk_entry_new();
185 port_entry = gtk_entry_new();
186 show_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(show_text));//获取显示文本框的缓存区
187 input_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(input_text));
188 gtk_text_view_set_editable(GTK_TEXT_VIEW(show_text), FALSE);//显示文本框不可编辑
189 scrolled1 = gtk_scrolled_window_new(NULL,NULL);//创建滚动窗口
190 scrolled2 = gtk_scrolled_window_new(NULL,NULL);
191
192 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled1), show_text);// 把文
本框添加到活动窗口
193 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled2), input_text);
194
195 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled1), GTK_POLICY_ALWAYS, GTK_POLIC Y_AUTOMATIC);//滚动条1显示方式,需要时显示
196 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled2), GTK_POLICY_ALWAYS, GTK_POLIC Y_AUTOMATIC); //滚动条2显示方式,需要时显示
197
198
199 hbox1 = gtk_hbox_new(FALSE,2);
200 hbox2 = gtk_hbox_new(FALSE,2);
201 hbox3 = gtk_hbox_new(FALSE,2);
202 vbox = gtk_vbox_new(FALSE,2);
203
204 gtk_box_pack_start(GTK_BOX(hbox1), send_button, TRUE, TRUE, 2);
205 gtk_box_pack_start(GTK_BOX(hbox1), close_button, TRUE, TRUE, 2);
206 gtk_box_pack_start(GTK_BOX(hbox2), ip_label, TRUE, TRUE, 2);
207 gtk_box_pack_start(GTK_BOX(hbox2), ip_entry, TRUE, TRUE, 2);
208 gtk_box_pack_start(GTK_BOX(hbox3), port_label, TRUE, TRUE, 2);
209 gtk_box_pack_start(GTK_BOX(hbox3), port_entry, TRUE, TRUE, 2);
210 gtk_box_pack_start(GTK_BOX(vbox), scrolled1, TRUE, TRUE, 5);
211 gtk_box_pack_start(GTK_BOX(vbox), scrolled2, TRUE, TRUE, 5);
212 gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 2);
213 gtk_box_pack_start(GTK_BOX(vbox), hbox3, FALSE, FALSE, 2);
214 gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, FALSE, 2);
215
216
217 gtk_container_add(GTK_CONTAINER(window), vbox);
218
219 g_signal_connect(G_OBJECT(send_button), "clicked", GTK_SIGNAL_FUNC(get_ip), (gpointer)ip_en try);
220 g_signal_connect(G_OBJECT(send_button), "clicked", GTK_SIGNAL_FUNC(get_port), (gpointer)por t_entry);
221 g_signal_connect(G_OBJECT(send_button), "clicked", GTK_SIGNAL_FUNC(send_text), NULL);
222 g_signal_connect(G_OBJECT(close_button), "clicked", GTK_SIGNAL_FUNC(quit_win), NULL);
223
224 gtk_widget_show_all(window);
225 gtk_widget_hide((GtkWidget *)(data));
226 }
227
228 void create_thread(GtkWidget *button, gpointer data )
229 {
230 int ret;
231 printf("aaaaaaa\n");
232 pthread_t recv_thread;
233 // pthread_create(&recv_thread, NULL, recv_func, NULL);
234 }
...全文
271 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
daih_feng 2013-04-19
  • 打赏
  • 举报
回复
那怎么解决这个问题啊 我想从外面输入端口号 这么解决
xiaoji0507 2013-04-19
  • 打赏
  • 举报
回复
调试了下。在如下地方有error

1   ret = recvfrom(server_sockfd, recv_text, 1024, 0 , (struct sockaddr *)&client_addr, &client_len);

client_len 从int *转化到socklen_t*时候报错。将client_len 声明成socklen_t即可

2  gchar *recv_text = malloc(1024);
改成 gchar *recv_text = (gchar *)malloc(1024);
改后程序可以正常跑起来 server_addr.sin_port = htons(atoi(port_text)); port_text 是NULL的。atoi的时候就段错误了。。。
xiaoji0507 2013-04-19
  • 打赏
  • 举报
回复
额。应该是CSDN格式化的问题。
xiaoji0507 2013-04-19
  • 打赏
  • 举报
回复
ret = recvfrom(server_sockfd, recv_text, 1024, 0 , (struct sockaddr *)&client_addr, &cl    ient_len);
这句没有问题吗?
daih_feng 2013-04-19
  • 打赏
  • 举报
回复
大神在哪里啊
daih_feng 2013-04-19
  • 打赏
  • 举报
回复
这是所有的代码 求帮忙
daih_feng 2013-04-19
  • 打赏
  • 举报
回复
235 int main( int argc, char *argv[]) 236 { 237 if(!g_thread_supported()) 238 g_thread_init(NULL); 239 gdk_threads_init(); 240 GtkWidget *window, *button, *label, *entry; 241 GtkWidget *vbox, *hbox; 242 243 gtk_init(&argc, &argv); 244 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 245 gtk_window_set_title(GTK_WINDOW(window), "chating"); 246 gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); 247 gtk_window_set_default_size(GTK_WINDOW(window), 200, 200); 248 g_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(quit_win), NULL); 249 label = gtk_label_new("user name"); 250 entry = gtk_entry_new(); 251 hbox = gtk_hbox_new (TRUE, 5); 252 vbox = gtk_vbox_new (TRUE, 5); 253 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 5); 254 gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 5); 255 256 button = gtk_button_new_with_label("登 录"); 257 g_signal_connect(GTK_OBJECT(button), "pressed", GTK_SIGNAL_FUNC(log_in), (gpointer)window); 258 g_signal_connect(GTK_OBJECT(button), "released", GTK_SIGNAL_FUNC(create_thread), NULL); 259 gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 5); 260 gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, FALSE, 5); 261 gtk_container_add(GTK_CONTAINER(window), vbox); 262 gtk_widget_show_all(window); 263 gtk_main(); 264 return 0; 265 }
daih_feng 2013-04-19
  • 打赏
  • 举报
回复
有人给我说 让我创建一个新的进程去控制recv_func函数 但是 select函数和poll用不来 有大神给简单的介绍下这两个函数嘛 小弟 在此多谢
zhouxf_cn 2013-04-19
  • 打赏
  • 举报
回复
命令行参数啊,argc,argv
xiaoji0507 2013-04-19
  • 打赏
  • 举报
回复
重新设计下你的程序结构吧

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧