c sendto功能在linux2.6.29中设置“网络无法访问”错误

时间:2016-07-26 15:13:28

标签: c linux sockets networking network-programming

我有类似的问题 sendto function setting "network is unreachable" errno 和(不太像)UDP Broadcast sendto failed:“network is unreachable” on linux 2.6.30但是由于这个问题没有得到解答而且已经很老了,我试着在这里重新阐述它们,并希望得到更多答案。

我有一个UDP服务器和客户端,客户端广播活动消息,服务器捕获它们(代码如下)。当我在几个不同的桌面Linux上运行这些,如ubuntu14.04,16.04,fedora6和......他们工作正常。但是当我尝试从mpc8308板上的ltib制作嵌入式Linux运行它们时,服务器工作(接收来自其他机器的消息)但是客户端设置错误到#34;网络无法访问"因为它叫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);
  }

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

int rc = setsockopts(clientSocket, SOL_SOCKET, SO_BINDTODEVICE, "eth0", 4);

我从 Bind UDP listening socket to specific interface (or find out the interface a datagram came in from)借用了此代码段。

1 个答案:

答案 0 :(得分:5)

你的代码很好。问题在于您的网络管理。

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