GetAddrInfo: dynamischer Port
-
Das endet mit WSAHOST_NOT_FOUND.

-
und du bist dir sicher das der host auch eine IPv6 adresse besitzt ?
und was meinst du mit dynamischer port ?
wo steht das du den scoket vor Connectex binden musst ?
warum verwendest du ueberhaup connectex ?
Meep Meep
-
> und du bist dir sicher das der host auch eine IPv6 adresse besitzt ?
Das sollte heut zu Tage eigentlich so sein.

> und was meinst du mit dynamischer port ?
Wenn man den Systemcall bind() auf Port 0 setzt, wird sich Windows einen Port innerhalb einer Range aussuchen.
For TCP/IP, if the port is specified as zero, the service provider assigns a unique port to the application from the dynamic client port range. On Windows Vista and later, the dynamic client port range is with a value between 49152 and 65535. This is a change from Windows Server 2003 and earlier where the dynamic client port range was a value between 1025 and 5000.
Nur, hier wird die Adresse nicht von mir, sondern von GetAddrInfo() vorbereitet.
> wo steht das du den scoket vor Connectex binden musst ?
s [in]
A descriptor that identifies an unconnected, previously bound socket. See Remarks for more information.
http://msdn.microsoft.com/en-us/library/ms737606(VS.85).aspx
Wenn du es nicht tust gibt's Fehlermeldung.
Jeder Socket braucht eine Adresse, das Berkeley-connect() macht's implizit.> warum verwendest du ueberhaup connectex ?
Ich brauche viele asynchrone Connect-Befehle gleichzeitig.
-
So, ich hab es jetzt etwas unschön gelöst, funktioniert jedoch. Nach dem Call von GetAddrInfo() ändere ich den Port in addrinfo::ai_addr manuell:
if(ai->ai_family == AF_INET) reinterpret_cast<sockaddr_in*>(ai->ai_addr)->sin_port = htons(0); else if(ai->ai_family == AF_INET6) reinterpret_cast<sockaddr_in6*>(ai->ai_addr)->sin6_port = htons(0); else throw net_error("unknown address familiy specified");
-
Dann würde mich aber mal interessieren was GetAddrInfo für einen Port setzt wenn man "0" übergibt.
Hast du auch schonmal NULL als Port ausprobiert?
-
Ich brauche viele asynchrone Connect-Befehle gleichzeitig.
Wundere dich nicht wenn du auf das Half-Open Connection Limit stösst.

-
hallo
ich hab nun mal selst einen connect ausprobiert. folgend funktioniert es:
void SocketClient::Connect(int type, int protocol, sockaddr *addr, WSAPROTOCOL_INFO *info, GROUP g, DWORD flags) { addrinfo hints = {0}; addrinfo *result; memset(&hints, 0, sizeof(hints)); hints.ai_family = addr->sa_family; hints.ai_socktype = type; hints.ai_protocol = protocol; hints.ai_flags = AI_PASSIVE; char hostname[255]; ::gethostname(hostname, 255); int res = getaddrinfo(hostname, 0, &hints, &result); if(res != 0) throw ::WSAGetLastError(); addrinfo *ptr; for(ptr = result; ptr != 0; ptr = ptr->ai_next) { Create(addr->sa_family, type, protocol, info, g, flags); // WSASocket if(m_sock == INVALID_SOCKET) continue; try { Bind(ptr->ai_addr); // bind } catch(...) { Close(); } if(m_sock != INVALID_SOCKET) break; } ::freeaddrinfo(result); if(m_sock == INVALID_SOCKET) return; GUID connectex_guid = WSAID_CONNECTEX; DWORD bytes; if(::WSAIoctl(m_sock, SIO_GET_EXTENSION_FUNCTION_POINTER, &connectex_guid, sizeof(connectex_guid), &overlapped.ConnectEx, sizeof(overlapped.ConnectEx), &bytes, 0, 0) == SOCKET_ERROR) throw ::WSAGetLastError(); overlapped.ConnectEx(m_sock, addr, SockAddrLen(addr), 0, 0, 0, &overlapped.overlapped); }'addr' welche der funktion uebergeben wird, ist die sockaddr des zu verbindenden servers.
vielleicht hilts dir ja weiter.Meep Meep
-
Nö, bei mir bedankt sich dann GetQueuedCompletionStatus mit ERROR_INVALID_NETNAME.
-
hi
koenntest du mal deinen client source posten ? oder ihn mir mal schicken ?
arbeite auch grad an IOCP und hab da noch so meine problemchen was das vertehen betrifft. vielleicht koennen wir uns da gemeinsam weiter helfenMeep Meep
-
Kann ich morgen machen.
