【问题标题】:simple UDP server can't accept packets简单的 UDP 服务器不能接受数据包
【发布时间】:2013-04-11 14:36:15
【问题描述】:

我有一个简单的 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");
       }
    }
    ~

我编译它

  gcc -m32 -o udp_server udp_server.c   

并在几台 linux 机器上运行它(./udp_server),它工作正常,我使用 udp 客户端将数据包发送到这些机器上的 UDP 服务器,它们被接受

但是我有一台新机器(姑且称它为A),相对其他linux机器来说比较陌生,如图https://superuser.com/questions/581442/ifconfig-command-not-found 无论如何它没有“eth0”,接口是:

    [root@kitch proxy]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT qlen 1000
    link/ether 00:1a:a0:23:86:6c brd ff:ff:ff:ff:ff:ff

首先,我在上面运行了 32 位版本的程序,我得到了

-bash: ./udp_server: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory

然后,第二,我编译没有'-m32'的UDP程序并在机器A上运行它,它运行正常 然后我使用UDP客户端向A上的UDP服务器发送数据包 我可以在这台机器上捕获发送的数据包,但是 UDP 服务器不接受这些数据包,

这有什么潜在的原因吗? 也许绑定在这里不起作用,因为这台机器很特殊? 谢谢!

【问题讨论】:

    标签: c linux networking network-programming


    【解决方案1】:

    最近的一些 Linux 发行版(例如 Fedora)已将接口的名称从 ethX 更改为 emX,所以没有问题。

    你的机器有问题,因为服务器根本没有运行,正如这条线所声称的:

    -bash: ./udp_server: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
    

    我猜你已经在没有安装32bit library support64bit 机器中以32bit 模式编译程序(查看-m32 gcc 参数)。

    在没有-m32 选项的情况下重新编译它。

    【讨论】:

    • 我都试过了,在我看来,32位机器应该可以在机器A上工作,但为什么不能呢?然后我编译它并成功运行./udp_server,只是它不能接受UDP数据包
    • 怎么能说运行成功呢?没有 32 位解释器就无法运行
    • 我的意思是尝试了 2 个版本。我在机器A上编译没有-m32选项,然后它运行成功,但它不能接受UDP数据包
    • 数据包到达机器A了吗? dst 端口是否正确?尝试关闭防火墙以进行测试(服务 iptables 停止)
    • 我可以使用tcpdump来捕获传入的UDP数据包,所以没有防火墙问题。和UDP端口是正确的。前面说了,我在其他几台机器上试过UDP服务器,都可以正确接受UDP包!
    猜你喜欢
    • 2017-10-13
    • 2015-07-13
    • 2019-05-26
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 2020-06-23
    相关资源
    最近更新 更多