1

我有一个非常简单的 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

这有潜在的原因吗?谢谢!

4

1 回答 1

1

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

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

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

于 2013-04-12T13:50:07.260 回答