免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7870 | 回复: 6

[网络] udp无法recvfrom接收数据 [复制链接]

论坛徽章:
0
发表于 2013-12-08 19:56 |显示全部楼层
用UDP传输数据

本地的客户端和服务端收发没问题,但是用对方机子发过来recvfrom无法接收,但是tcpdump可以嗅探到数据发过来了!

不知道问题何在啊,

服务端代码如下

[/code]
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define SERV_PORT 8866
#define MAXLINE 1024

int main(int argc, char **argv)
{
        int        sockfd;
        int        fd;
        int         num_recv;
        socklen_t len;
        char *recv_buf = malloc(MAXLINE);
        struct        sockaddr_in        servaddr, cliaddr;


        fd = open(argv[1],O_RDWR|O_TRUNC|O_CREAT); //打开文件
        if(fd < 0){
                perror("open file");
        }else{
                printf("open file success!\n");
        }


        sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); //建立套接子
        if(sockfd < 0){
                perror("socket");
        }

        bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family      = AF_INET;
        inet_pton(AF_INET,"192.168.1.100",(struct sockaddr*)&servaddr.sin_addr.s_addr); //192.168.1.100是我的局域网IP
        servaddr.sin_port        = htons(SERV_PORT);
       
        if(bind(sockfd, (struct sockaddr *) &servaddr,\
                         sizeof(servaddr))<0){
                perror("bind");
        }
       
        printf("now begin recvie file \n");
        for ( ; ; ) {
                num_recv = recvfrom(sockfd, recv_buf, MAXLINE, 0, (struct sockaddr*)&cliaddr, &len); //接收
                if(num_recv < 0){
                        perror("recvfrom");
                }
                printf("this time recved%d\n",num_recv);
                write(fd,recv_buf,num_recv);
        }
        free(recv_buf);
        close(fd);
        return 0;
}

论坛徽章:
0
发表于 2013-12-09 10:00 |显示全部楼层
把客户端代码也贴出来啊。难不成,帮你分析问题,还得自己写个客户端不行?:wink:

论坛徽章:
0
发表于 2013-12-09 10:24 |显示全部楼层
回复 2# heartless_cu
昨晚又试了一下,换台机子可以,我怀疑是机器问题了,正在准备重装系统,
但是我也不明白,用tcp的时候没问题啊,而且tcpdump能嗅谈到别的机子上发过来的udp包,但就是recvfrom无法返回数据。
客户端代码:

  1. #include <unistd.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <signal.h>
  6. #include <sys/stat.h>
  7. #include <fcntl.h>
  8. #include <errno.h>
  9. #include <netdb.h>
  10. #include <sys/types.h>
  11. #include <sys/socket.h>
  12. #include <netinet/in.h>
  13. #include <arpa/inet.h>

  14. #define SERV_PORT 8866
  15. #define MAXLINE 1024

  16. int main(int argc, char **argv)
  17. {
  18.         int        sockfd;
  19.         int        fd;
  20.         int         num_send,sequence;
  21.         char         *send_buf = malloc(MAXLINE);
  22.         struct        sockaddr_in        servaddr, cliaddr;
  23.        
  24.         fd = open(argv[1],O_RDWR|O_TRUNC|O_CREAT);
  25.         if(fd < 0){
  26.                 perror("open file");
  27.         }else{
  28.                 printf("open file success!\n");
  29.         }
  30.         sockfd = socket(AF_INET, SOCK_DGRAM,IPPROTO_UDP);
  31.        

  32.         bzero(&servaddr, sizeof(servaddr));
  33.         servaddr.sin_family      = AF_INET;
  34.         servaddr.sin_addr.s_addr = inet_addr(argv[2]);
  35.         servaddr.sin_port        = htons(SERV_PORT);
  36.        
  37.         printf("now begin send file to %s %d \n",argv[2],ntohs(servaddr.sin_port));
  38.         for ( ; ; ) {
  39.                 *((int *)send_buf) = sequence;
  40.                 num_send = sendto(sockfd, send_buf, MAXLINE,\
  41.                          0,(struct sockaddr *)&servaddr,sizeof(servaddr));
  42.                 if(num_send < 0){
  43.                         perror("sendto");
  44.                 }
  45.                 printf("this time send%d\n",num_send);
  46.         }
  47.         free(send_buf);
  48.         close(fd);
  49.         return 0;
  50. }
复制代码

论坛徽章:
0
发表于 2013-12-09 10:39 |显示全部楼层
可以嗅谈到,结果
10:35:46.418975 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.419446 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.419919 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.420576 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.420975 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.421336 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.421731 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.422121 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.422594 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.423013 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.423385 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.423812 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.424281 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.424665 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.425111 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.425857 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024
10:35:46.426332 IP 192.168.1.133.filenet-pa > 192.168.1.100.8866: UDP, length 1024

但是服务程序没反应。

论坛徽章:
0
发表于 2013-12-09 10:57 |显示全部楼层
for ( ; ; ) {
                len = sizeof(cliaddr);// 这句是必须有的
                num_recv = recvfrom(sockfd, recv_buf, MAXLINE, 0, (struct sockaddr*)&cliaddr, &len); //接收
                if(num_recv < 0){
                        perror("recvfrom");
                }
                printf("this time recved%d\n",num_recv);
                write(fd,recv_buf,num_recv);
        }

论坛徽章:
4
白羊座
日期:2013-09-17 21:59:30技术图书徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40双子座
日期:2013-12-17 18:26:39
发表于 2013-12-09 11:40 |显示全部楼层
楼上说的是一个问题。
看你的描述:
1.本地之间可以收发,与远程不可以
2.tcpdump可以抓到远程的数据包
3.换一台机器也可以了
你可以看看防火墙的设置,这也可能导致这种现象。

论坛徽章:
0
发表于 2013-12-09 11:58 |显示全部楼层
井蛙夏虫 发表于 2013-12-09 11:40
楼上说的是一个问题。
看你的描述:
1.本地之间可以收发,与远程不可以



谢谢!:wink:
确实是防火墙问题,用的是红帽企业版,防火墙没关,开放相应端口可以了。

哦,终于可以继续向下做了,卡了两天了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP