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öglichDaten 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
läuft0
funktioniert; dienetstat -au
erwähnt ein Werkzeug auf Port lauscht2
, während das ProgrammFehlermeldung:
BIND failed! Error: Address family not supported by protocol
, also 2 Fragen offen sind hier:
Was soll ich tun falsch?
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?
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
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