免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2559 | 回复: 8
打印 上一主题 下一主题

用UDP协议的程序的发送问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-10 22:28 |只看该作者 |倒序浏览
仿别人程序写的个程序如下,只能一个对一个,所以没有写serve,直接端对端通信,问题是老接不到发出去的消息,包括发给自己的。求大牛指导,万分感谢。代码如下:

  1. client.h
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include <sys/types.h>
  6. #include <sys/socket.h>
  7. #include <netinet/in.h>
  8. #include <errno.h>
  9. #include <semaphore.h>
  10. #include <unistd.h>
  11. #include <pthread.h>


  12. #define PORT 8888
  13. sem_t send_sem;
  14. struct sockaddr_in my_addr;
  15. int sockfd;

  16. gchar *serv_IP;
  17. gchar *text;//要发送的文本
  18. gchar rec_text[1024];//接收到的文本

  19. GtkTextBuffer *show_buffer,*input_buffer;
  20. socklen_t len=sizeof(my_addr);
  21. void show_rec()
  22. {
  23.    GtkTextIter start,end;
  24.     gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(show_buffer),&start,&end);
  25.     gtk_text_buffer_insert(GTK_TEXT_BUFFER(show_buffer),&end,"他说:\n",8);
  26.     gtk_text_buffer_insert(GTK_TEXT_BUFFER(show_buffer),&end,rec_text,strlen(rec_text)-1);
  27.     gtk_text_buffer_insert(GTK_TEXT_BUFFER(show_buffer),&end,"\n",1);
  28. }
  29. void *rec_func(void *arg)
  30. {
  31.     while(1)
  32.     {
  33.         if(recvfrom(sockfd,rec_text,sizeof(rec_text),0,NULL,&len)<0)
  34.         {
  35.             perror("server recv error");
  36.             exit(1);
  37.         }
  38.         fprintf(stdout,"他说 : %s \n",rec_text);
  39.     }
  40. }

  41. void *sen_func(void *arg)
  42. {
  43.    
  44.     while(1)
  45.     {
  46.         sem_wait(&send_sem);
  47.         if(sendto(sockfd,text,sizeof(text),0,(struct sockaddr*)&my_addr,len)==-1)
  48.         {
  49.             perror("S send error");
  50.             exit(1);
  51.         }
  52.     }
  53. }

  54. void begin_serve()
  55. {
  56.    gint res_t;
  57.    pthread_t rec_pthread,sen_pthread;
  58.    pthread_attr_t pthread_attr;
  59.    
  60.   if((res_t=sem_init(&send_sem,0,0))==-1)
  61.      {
  62.      perror("Semaphore init error");
  63.      exit(EXIT_FAILURE);   
  64.      }
  65.    if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1)
  66.     {
  67.         perror("Socket Error");
  68.         exit(EXIT_FAILURE);
  69.     }
  70.    
  71.     bzero(&my_addr,sizeof(my_addr));
  72.     my_addr.sin_family=AF_INET;
  73.     my_addr.sin_port=htons(PORT);
  74.    
  75.    if(inet_pton(AF_INET,serv_IP,&my_addr.sin_addr)<=0)
  76.     {
  77.         fprintf(stderr,"IP error\n");
  78.         exit(1);
  79.     }
  80.     if((res_t=pthread_attr_init(&pthread_attr))==-1)
  81.       {
  82.       perror("Initiating pthread failed");
  83.       exit(EXIT_FAILURE);
  84.       }
  85.    if((res_t=pthread_attr_setdetachstate(&pthread_attr,PTHREAD_CREATE_DETACHED))==-1)
  86.       {
  87.       perror("Setting detached attribute failed");
  88.       exit(EXIT_FAILURE);
  89.       }
  90.   
  91.    if((res_t=pthread_create(&sen_pthread,&pthread_attr,sen_func,NULL))==-1)
  92.       {
  93.       perror("Creating sen_pthread error");
  94.       exit(EXIT_FAILURE);
  95.       }
  96.    if((res_t=pthread_create(&rec_pthread,&pthread_attr,rec_func,NULL))==-1)
  97.       {
  98.        perror("Creating rec_pthread error");
  99.        exit(EXIT_FAILURE);
  100.       }
  101.      pthread_attr_destroy(&pthread_attr);
  102. }

  103. 以下大部分为GTK的东西,没有什么问题
  104. #include <gtk/gtk.h>
  105. #include "client.h"

  106. void quit_win(GtkWidget *window,gpointer *data)
  107. {
  108.   gtk_main_quit();
  109. }


  110. void show_text(const gchar* text)
  111. {
  112.    GtkTextIter start,end;
  113.    gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(show_buffer),&start,&end);
  114.    gtk_text_buffer_insert(GTK_TEXT_BUFFER(show_buffer),&end,"锤锤爷说:\n",13);
  115.    gtk_text_buffer_insert(GTK_TEXT_BUFFER(show_buffer),&end,text,strlen(text));
  116.    gtk_text_buffer_insert(GTK_TEXT_BUFFER(show_buffer),&end,"\n",1);
  117. }

  118. void get_IP_func(GtkWidget *widget,gpointer IP_text)
  119. {
  120.     GtkTextIter start,end;
  121.     serv_IP=(gchar *)gtk_entry_get_text(GTK_ENTRY((GtkWidget *)IP_text));//获得IP地址
  122.     gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(show_buffer),&start,&end);
  123.     gtk_text_buffer_insert(GTK_TEXT_BUFFER(show_buffer),&end,"连接成功... \n",17);
  124.     begin_serve();
  125. }
  126. void send_func(GtkWidget *widget,gpointer *data)
  127. {
  128.      sem_post(&send_sem);
  129.      GtkTextIter start,end;
  130.      gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(input_buffer),&start,&end);
  131.      text=(char *)gtk_text_buffer_get_text(GTK_TEXT_BUFFER(input_buffer),&start,&end,FALSE);
  132.      gtk_text_buffer_delete(GTK_TEXT_BUFFER(input_buffer),&start,&end);
  133.      show_text(text);
  134. }

  135. void clean_func(GtkWidget *widget,gpointer *data)
  136. {
  137.      GtkTextIter start,end;
  138.      gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(show_buffer),&start,&end);
  139.      gtk_text_buffer_delete(GTK_TEXT_BUFFER(show_buffer),&start,&end);
  140.   }
  141. gint main(gint argc,gchar **argv)
  142. {
  143.    GtkWidget *window;
  144.    GtkWidget *scroll_1,*scroll_2;
  145.    GtkWidget *send_button,*clean_button,*quit_button,*link_button;
  146.    GtkWidget *IP_text,*input_text,*show_text;
  147.    GtkWidget *IP_label,*space_label;
  148.    GtkWidget *vbox,*hbox;
  149.    
  150.    
  151.    gtk_init(&argc,&argv);
  152.   
  153.    window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
  154.    gtk_window_set_title(GTK_WINDOW(window),"juffun-Chat");
  155.    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
  156.    gtk_window_set_default_size(GTK_WINDOW(window),450,360);
  157.    
  158.   
  159.    send_button=gtk_button_new_with_label("发送");
  160.    link_button=gtk_button_new_with_label("连接");
  161.    clean_button=gtk_button_new_with_label("清空");
  162.    quit_button=gtk_button_new_with_label("关闭");
  163.    IP_label=gtk_label_new("IP地址:");
  164.    space_label=gtk_label_new("");
  165.    
  166.    IP_text=gtk_entry_new_with_max_length(16);
  167.    show_text=gtk_text_view_new();
  168.    input_text=gtk_text_view_new();

  169.    show_buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(show_text));
  170.    input_buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(input_text));
  171.    
  172.    gtk_text_view_set_editable(GTK_TEXT_VIEW(show_text),FALSE);
  173.    
  174.    scroll_1=gtk_scrolled_window_new(NULL,NULL);
  175.    scroll_2=gtk_scrolled_window_new(NULL,NULL);
  176.    gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scroll_1),show_text);
  177.    gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scroll_2),input_text);

  178.    
  179.    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_1),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
  180.    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_2),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
  181.    
  182.    vbox=gtk_vbox_new(FALSE,0);
  183.    hbox=gtk_hbox_new(FALSE,0);
  184.    
  185.    gtk_container_add(GTK_CONTAINER(window),vbox);
  186.    gtk_box_pack_start(GTK_BOX(vbox),scroll_1,TRUE,TRUE,8);
  187.    gtk_box_pack_start(GTK_BOX(vbox),scroll_2,FALSE,FALSE,2);
  188.    gtk_box_pack_start(GTK_BOX(hbox),IP_label,FALSE,FALSE,2);
  189.    gtk_box_pack_start(GTK_BOX(hbox),IP_text,FALSE,FALSE,2);
  190.    gtk_box_pack_start(GTK_BOX(hbox),link_button,FALSE,FALSE,2);
  191.    gtk_box_pack_start(GTK_BOX(hbox),space_label,TRUE,TRUE,0);
  192.    gtk_box_pack_start(GTK_BOX(hbox),clean_button,FALSE,FALSE,2);
  193.    gtk_box_pack_start(GTK_BOX(hbox),send_button,FALSE,FALSE,2);
  194.    gtk_box_pack_start(GTK_BOX(hbox),quit_button,FALSE,FALSE,2);
  195.    gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,2);
  196.    
  197.    g_signal_connect(GTK_OBJECT(window),"destroy",GTK_SIGNAL_FUNC(quit_win),NULL);
  198.    g_signal_connect(GTK_OBJECT(link_button),"clicked",GTK_SIGNAL_FUNC(get_IP_func),IP_text);
  199.    g_signal_connect(GTK_OBJECT(clean_button),"clicked",GTK_SIGNAL_FUNC(clean_func),NULL);
  200.    g_signal_connect(GTK_OBJECT(send_button),"clicked",GTK_SIGNAL_FUNC(send_func),NULL);
  201.    g_signal_connect(GTK_OBJECT(quit_button),"clicked",GTK_SIGNAL_FUNC(quit_win),NULL);
  202.    
  203.    gtk_widget_show_all(window);
  204.    gtk_main();
  205.    return 0;

  206. }
复制代码

[ 本帖最后由 juffun 于 2008-7-10 22:54 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-07-11 09:17 |只看该作者
        
        sem_wait(&send_sem);
        if(sendto(sockfd,text,sizeof(text),0,(struct sockaddr*)&my_addr,len)==-1)
        {
            perror("S send error");
            exit(1);
        }


以前遇到过此类问题, socket传输带有\0字符的串会出错, 所以我想您那应该用 strlen(text)

然后您试着把发送前的BUF值以及成功发送的字节数给打出来,方便调试! 看看能不能找到问题

论坛徽章:
0
3 [报告]
发表于 2008-07-11 15:36 |只看该作者

回复 #2 linternt 的帖子

谢谢你了,我改成了strlen运行的时候说是段错误了。。。不知道怎么回事

论坛徽章:
0
4 [报告]
发表于 2008-07-11 19:13 |只看该作者
my_addr.sin_addr.s_addr = ???

是这个问题吗?没有指定接收IP

论坛徽章:
0
5 [报告]
发表于 2008-07-11 19:27 |只看该作者

回复 #1 juffun 的帖子

bzero(&my_addr,sizeof(my_addr));
    my_addr.sin_family=AF_INET;
// ip!!?
    my_addr.sin_port=htons(PORT);

论坛徽章:
0
6 [报告]
发表于 2008-07-11 23:17 |只看该作者
if(inet_pton(AF_INET,serv_IP,&my_addr.sin_addr)<=0)
    {
        fprintf(stderr,"IP error\n");
        exit(1);
    }
这个是用于将IP写进去的

论坛徽章:
0
7 [报告]
发表于 2008-07-11 23:50 |只看该作者

回复 #6 juffun 的帖子

我将sockfd与本机的IP,bind后就可以接收到消息了,不知道为什么?

论坛徽章:
0
8 [报告]
发表于 2008-07-12 01:51 |只看该作者
- -#faint,虽然你说的是所谓的端到端,但是还是有一个是做为服务端的,做服务端的时候,是需要绑定一下的。

一般的

UDP编程的服务器端一般步骤是:

1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、循环接收数据,用函数recvfrom();
5、关闭网络连接;


UDP编程的客户端一般步骤是:

1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置对方的IP地址和端口等属性;
5、发送数据,用函数sendto();
6、关闭网络连接;

论坛徽章:
0
9 [报告]
发表于 2008-07-12 01:54 |只看该作者
原帖由 juffun 于 2008-7-11 23:17 发表
if(inet_pton(AF_INET,serv_IP,&my_addr.sin_addr)


这个还能这样用啊~,呵呵。学到了~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP