2016-07-18 20 views
0

Sowohl die IP-Adresse als auch der Port werden bestätigt nicht von netstat -a -n. verwendet Wenn ich gdb benutze und die Methode rufende bind einreiße, sehe ich, dass die richtige IP-Adresse und der Port zusammen mit einer angemessenen Socket-Adresslänge von 16 verwendet werden ein UDP-Listener. Die Remote-IP ist statisch und wird aus einer Konfigurationsdatei gelesen.Wie zu beheben 'Kann angeforderte Adresse nicht zuordnen?'

Dies ist der Code,

void CSocket::Bind(IpEndPoint& endPoint) 
{ 
    int bindResult = bind(socketHandle, endPoint.GetSockAddrPtr(), 
     endPoint.GetAddrLength()); 
    if(bindResult < 0) 
    { 
     TRACE_ERROR("Failed to bind to socket. %s. IpAddress %s Port %d AddrLength %d", 
      strerror(errno), endPoint.GetIpAddressString(), 
      ntohs(endPoint.GetPort()), endPoint.GetAddrLength()); 

dies von GDB ist, ist

Breakpoint 1, CSocket::Bind (this=0x819fa24, ipAddress="192.0.2.77", port=4185) at Socket.cpp:126

und dies der TRACE_ERROR aus dem Code oben

ERROR: Failed to bind to socket. errno 99 (Cannot assign requested address). IpAddress 192.0.2.77 Port 4185 AddrLength 16

Ich habe Wieder- gewesen Lesen Beej's Guide to Network Programming, aber keine Spur gefunden. Dies ist UDP, daher sollte eine Verbindung nicht zum Binden benötigt werden. Die Firewall ist ausgeschaltet. Wo sollte ich sonst hinschauen?

+0

Ich würde sehen, wie die IP-Adresse als Zeichenfolge konvertiert wird zum erforderlichen 'struct sockaddr' Objekt. Ist die Adresse, an die Sie binden möchten, wirklich eine lokale Adresse? Wenn es der Remote-Host sein soll, verwenden Sie stattdessen connect. Wird der Port bereits verwendet? (...) – Aconcagua

+0

Nur ein Tipp: Ich persönlich bevorzuge lieber den Fehlercode als den Fehlerstring - und ich bin wahrscheinlich nicht der einzige ... Könnte eine gute Idee sein, e zu verwenden. G. "% d (% s)", errno, strerror (errno), um beide Brüche zu erfüllen. – Aconcagua

+0

@Aconcagua danke. Fehlercode wie vorgeschlagen hinzugefügt. Warum benötigt UDP 'connect', wenn es' verbindungslos ist? ' – jacknad

Antwort

1

Nach was @Aconcagua sagte: Sie möchten eine Adresse binden, die lokal ist (nicht eine, die "nicht verwendet" ist). Sie können nicht nur eine lokale Adresse erstellen. Sie verwenden entweder INADDR_ANY, um an eine beliebige Adresse zu binden, oder Sie müssen eine Bindung an eine Ihrer lokalen Schnittstellen erstellen. Dies ist wahrscheinlich das Problem. (bind legt die lokale Adresse, connect legt die entfernte Adresse - oder, mit UDP, können Sie die Remote-Adresse pro Paket mit sendto angeben.) - Gil Hamilton