pingshunbobo 发表于 2013-12-08 19:56

udp无法recvfrom接收数据

用UDP传输数据

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

不知道问题何在啊,

服务端代码如下


#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,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;
}

heartless_cu 发表于 2013-12-09 10:00

把客户端代码也贴出来啊。难不成,帮你分析问题,还得自己写个客户端不行?:wink:

pingshunbobo 发表于 2013-12-09 10:24

回复 2# heartless_cu
昨晚又试了一下,换台机子可以,我怀疑是机器问题了,正在准备重装系统,
但是我也不明白,用tcp的时候没问题啊,而且tcpdump能嗅谈到别的机子上发过来的udp包,但就是recvfrom无法返回数据。
客户端代码:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#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_send,sequence;
        char         *send_buf = malloc(MAXLINE);
        struct        sockaddr_in        servaddr, cliaddr;
       
        fd = open(argv,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);
       

        bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family      = AF_INET;
        servaddr.sin_addr.s_addr = inet_addr(argv);
        servaddr.sin_port      = htons(SERV_PORT);
       
        printf("now begin send file to %s %d \n",argv,ntohs(servaddr.sin_port));
        for ( ; ; ) {
                *((int *)send_buf) = sequence;
                num_send = sendto(sockfd, send_buf, MAXLINE,\
                       0,(struct sockaddr *)&servaddr,sizeof(servaddr));
                if(num_send < 0){
                        perror("sendto");
                }
                printf("this time send%d\n",num_send);
        }
        free(send_buf);
        close(fd);
        return 0;
}

pingshunbobo 发表于 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

但是服务程序没反应。

heartless_cu 发表于 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);
      }

井蛙夏虫 发表于 2013-12-09 11:40

楼上说的是一个问题。
看你的描述:
1.本地之间可以收发,与远程不可以
2.tcpdump可以抓到远程的数据包
3.换一台机器也可以了
你可以看看防火墙的设置,这也可能导致这种现象。

pingshunbobo 发表于 2013-12-09 11:58

井蛙夏虫 发表于 2013-12-09 11:40 static/image/common/back.gif
楼上说的是一个问题。
看你的描述:
1.本地之间可以收发,与远程不可以



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

哦,终于可以继续向下做了,卡了两天了。:em49:
页: [1]
查看完整版本: udp无法recvfrom接收数据