2016-08-16 75 views
0

在PowerPC架构上运行Linux系统,该系统通过以太网连接到另一个获取UDP连接的设备(基于套件), 我尝试设置套接字并将其绑定到我的端口8813 。但是每当我输入与0不同的端口时,绑定失败。C++绑定UDP套接字地址系列不支持

下面是代码:

int connector::initUDPSocket(){ 
    struct hostent *server; 
    //Construct Socket 
    struct sockaddr_in { 
     __uint8_t sin_len; 
     sa_family_t sin_family; 
     in_port_t sin_port; 
     struct in_addr sin_addr; 
     char sin_zero[8]; 
    } 
    ; 
    sockaddr_in socketaddress; 
    socklen_t addrlen = sizeof(struct sockaddr_in); /* length of addresses */ 


    udpsocket=socket(AF_INET,SOCK_DGRAM ,0); 

    if(udpsocket<=0) 
    { 
     printf("No Socket opened!"); 
     return 1; 
    } 
    else 
    { 
     printf("ONE Socket opened!"); 

     memset((char *) &socketaddress,0, sizeof(socketaddress)); 


     socketaddress.sin_family = AF_INET; 
     socketaddress.sin_addr.s_addr=htonl(inet_addr("192.168.0.10"));//<=That's the external devices address;// htonl(inet_addr("192.168.0.1"));//<=That's my devices address;//htonl(INADDR_ANY);//INADDR_ANY;// 
     socketaddress.sin_port = htons(8813);//8813;//htonl(8813);//htons(0); //<=Only the last one works 


     int bind_result=bind(udpsocket,(struct sockaddr *)&socketaddress,sizeof(socketaddress)); 
     if(bind_result == SOCKET_ERROR) 
     { 

      printf(LFL_CRI,"BIND failed! Error: %s",strerror(errno)); //Returns "BIND failed! Error: Address family not supported by protocol" 
     } 
     else 
     { 
      printf(LFL_CRI,"BIND worked!"); 
       //Nun den Listener für den DatenStream aufsetzen. 
       char  SockAddrBuffer[sizeof(struct sockaddr_storage)]; 
       socklen_t SockAddrBufferSize = sizeof(SockAddrBuffer); 
       int numofbytes=recvfrom(udpsocket, udp_buffer, UDP_BUFFERSIZE, 0, (struct sockaddr *)SockAddrBuffer, &SockAddrBufferSize); 
       if (numofbytes >0) 
       { 
        printf("%i bytes received",numofbytes); 
       } 
      } 

     } 
     return 0; 
    } 
} 

我发现了什么至今:

  • 192.168.0.10可能

  • 数据似乎并没有被防火墙阻止; iptables -nvL提到没有丢包。为此,我添加了一条新规则,在应用此规则之前,连接外部设备时会增加数量或丢弃的数据包。

  • 在我的Windows PC上使用测试工具(只需调试,如果端口上有传入流量;将外部设备连接到它),我会接收数据;所以,外部设备肯定发送数据

  • 绑定到端口0工作;在netstat -au提到的工具监听端口2,在程序运行时

  • 错误消息:BIND failed! Error: Address family not supported by protocol

所以,2个问题在这里开:

  1. 我在做什么错误?

  2. 我对“绑定”的理解错误。听听“系统分配给我的程序的一些随机端口”有什么意义?我的意思是,如果我设置了http-Server,我想听Port 80而不是端口“RANDOM”。这有什么好处?

+2

你为什么重新定义'sockaddr_in'?包括''来获得对你的工具链正确的那个。如果它被排除在工具链之外,可能有一个很好的理由。 – user4581301

+0

在某些地方,您正在使用'printf'而不是'fprintf'。 'udpsocket'没有声明,我想它应该是整数。你可以创建[MCVE](http://stackoverflow.com/help/mcve)吗? – karastojko

回答

0

您已在代码中重新定义了struct sockaddr_in。如果与系统定义方式有所不同,则任何试图使用此结构的代码都将无法正常工作。

您需要#include <netinet/in.h>才能获得该结构的正确定义。

+0

谢谢,那正是问题:) –