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?
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
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
@Aconcagua danke. Fehlercode wie vorgeschlagen hinzugefügt. Warum benötigt UDP 'connect', wenn es' verbindungslos ist? ' – jacknad