c sendto函数在linux2.6.29中设置“网络不可访问” errno

mhk*_*mhk 4 c sockets linux networking network-programming

我有一个类似于 sendto函数设置“网络无法访问”的问题,errno 和(不太像UDP广播sendto失败:Linux 2.6.30上的“网络无法访问”,但是由于此问题未得到回答并且很老,我尝试过在此重新说明它们,以期得到答案。

我有一个UDP服务器和客户端,客户端在其中广播活动消息,服务器捕获它们(代码如下)。当我在ubuntu14.04、16.04,fedora6等几个不同的台式机linux上运行它们时,它们工作正常。但是,当我尝试从mpib8308板上的ltib嵌入式Linux运行它们时,服务器正常工作(从其他计算机接收消息),但客户端将errno设置为“网络不可访问”,因为它调用sendto。
我尝试了wireshark,但客户端没有板载接口上的数据包,并且我在板上使用tcpdump测试了系统,并且那里没有生成的数据包。

这是客户端的代码:

  int clientSocket, portNum, nBytes;
  char buffer[1024];
  struct sockaddr_in serverAddr;
  socklen_t addr_size;

  /*Create UDP socket*/
  clientSocket = socket(AF_INET, SOCK_DGRAM, 0);
  int broadcastEnable=1;
  int retsockopts=setsockopt(clientSocket, SOL_SOCKET, SO_BROADCAST, &broadcastEnable, sizeof(broadcastEnable));
  /*Configure settings in address struct*/
  serverAddr.sin_family = AF_INET;
  serverAddr.sin_port = htons(12021);
  serverAddr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
  memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero);  

  /*Initialize size variable to be used later on*/
  addr_size = sizeof serverAddr;

  while(1){
    sprintf(buffer,"I AM ALIVE");

    nBytes = strlen(buffer) + 1;

    int err;
    err = sendto(clientSocket,buffer,nBytes,0,(struct sockaddr *)&serverAddr,addr_size);
    if(err==-1) //error occured
    {
        printf("error sending alive message: %s\n",strerror(errno));
    }

    sleep(5);
  }
Run Code Online (Sandbox Code Playgroud)

编辑:
我检查了将广播消息发送到子网广播IP地址,并且它起作用了。但是全球广播地址无法访问...我认为问题是操作系统无法识别它应该使用哪个网络接口来发送此数据包,但是我不知道如何解决它。EDIT2:
我在代码中添加了一些选项,以便套接字绑定到特定的接口,并且可以解决上述问题,并且可以正常工作:

int rc = setsockopts(clientSocket, SOL_SOCKET, SO_BINDTODEVICE, "eth0", 4);
Run Code Online (Sandbox Code Playgroud)

我从绑定UDP侦听套接字到特定接口(或找出数据报来自的接口)中借用了此代码段。

Rob*_*obᵩ 5

您的代码很好。问题出在您的网络管理中。

您缺少默认路由。DHCP服务器可能提供了默认路由,您可能必须在网络配置文件中指定默认路由,或者可能必须发出类似的命令route add default gw 192.0.2.1