2016-08-16 3 views
0

Ausführen eines Linux-Systems auf einer PowerPC-Architektur, die über Ethernet mit einem anderen Gerät verbunden ist, erhalten eine UDP-Verbindung (Package Based), Ich versuche, einen Socket einzurichten und an meinen Port 8813 zu binden . Aber wenn ich einen anderen Port als 0 eingeben, schlägt die Bindung fehl. HierC++ Bind UDP Socket Adresse Familie nicht supported

ist der Code:

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; 
    } 
} 

Was fand ich heraus, so weit:

  • Ping 192.168.0.10 ist möglich

  • Daten scheinen nicht von der Firewall blockiert werden; iptables -nvL erwähnt keine fallengelassenen Pakete. Ich habe eine neue Regel dafür hinzugefügt, bevor diese Regel angewendet wurde, wurden die Anzahl oder die verlorenen Pakete erhöht, wenn das externe Gerät verbunden wurde.

  • Mit einem Test-Tool auf meinem Windows-PC (einfach Debuggen, wenn an einem Port eingehenden Datenverkehr; verbinden das externe Gerät mit ihm), erhalte ich Daten; So sendet das externe Gerät definitiv Daten

  • Bindung an Port 0 funktioniert; die netstat -au erwähnt ein Werkzeug auf Port lauscht 2, während das Programm

    läuft
  • Fehlermeldung: BIND failed! Error: Address family not supported by protocol

, also 2 Fragen offen sind hier:

  1. Was soll ich tun falsch?

  2. Was verstehe ich falsch über "binden". Welchen Sinn macht es, "irgendeinen zufälligen Port zu hören, der meinem Programm vom System zugewiesen wurde"? Ich meine, wenn ich einen http-Server einrichte, möchte ich Port 80 hören und nicht "RANDOM" portieren. Wofür ist das gut?

+2

Warum definieren Sie 'sockaddr_in' neu? Fügen Sie '' ein, um den für Ihre Werkzeugkette korrekten Wert zu erhalten. Wenn es aus der Werkzeugkette heraus gelassen wurde, gibt es wahrscheinlich einen guten Grund. – user4581301

+0

An einigen Stellen verwenden Sie 'printf' anstelle von' fprintf'. 'udpsocket' ist nicht deklariert, ich denke es sollte ganzzahlig sein. Kannst du bitte [MCVE] (http://stackoverflow.com/help/mcve) erstellen? – karastojko

Antwort

0

Sie haben struct sockaddr_in in Ihrem Code neu definiert. Wenn es in irgendeiner Weise anders ist, als das System es definiert, wird jeder Code, der versucht, diese Struktur zu verwenden, nicht ordnungsgemäß funktionieren.

Sie müssen #include <netinet/in.h>, um die richtige Definition dieser Struktur zu erhalten.

+0

Danke, das war genau das Problem :) –