UDP服务器进程无法接受来自内核的数据包

时间:2013-04-12 13:47:53

标签: linux networking network-programming fedora

我有一个非常简单的UDP服务器程序

    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <stdio.h>
    #include <string.h>


    int main(int argc, char**argv)
    {
       int sockfd,n;
       struct sockaddr_in servaddr,cliaddr;
       socklen_t len;
       char mesg[1000];

       sockfd=socket(AF_INET,SOCK_DGRAM,0);

       bzero(&servaddr,sizeof(servaddr));
       servaddr.sin_family = AF_INET;
       servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
       servaddr.sin_port=htons(54000);
       bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));

       for (;;)
       {
          len = sizeof(cliaddr);
          n = recvfrom(sockfd,mesg,1000,0,(struct sockaddr *)&cliaddr,&len);
          sendto(sockfd,mesg,n,0,(struct sockaddr *)&cliaddr,sizeof(cliaddr));
          printf("-------------------------------------------------------\n");
          mesg[n] = 0;
          printf("Received the following:\n");
          printf("%s",mesg);
          printf("-------------------------------------------------------\n");
       }
    }

我把它放在几台机器上,让udp客户端向它发送数据包 它可以成功接受传入的udp数据包

然后我把它放在装有fedora 18的机器上 我编译程序并运行它 然后我让一个udp客户端向它发送数据包(与其他机器上相同) 但程序无法接受传入的UDP数据包 我使用tcpdump进行捕获,我可以看到传入的udp数据包 为什么服务器程序不接受这台机器上的传入UDP数据包?

我检查了iptables规则iptables -L 结果在

https://docs.google.com/file/d/0B09y_TWqTtwlNHp1eTJkTFNuY0k/edit?usp=sharing

有潜在的原因吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

乍一看,代码看起来还不错。

最明显的解释可能只是Fedora 18计算机安装了默认配置的iptables防火墙......

尝试运行lsmod查找已加载的iptables模块,和/或iptables -L列出当前规则集。