GetAddrInfo will nicht so recht
-
Hallo!
Immer, wenn ich eine DNS-Adresse auflösen möchte, liefert mir GetAddrInfoW() die IP 204.204.204.204. WSAGetLastError() ist 0.
addrinfoW addr_hint, *addr_info = 0; std::memset(&addr_hint, 0, sizeof(ADDRINFOW)); addr_hint.ai_family = AF_INET; addr_hint.ai_socktype = SOCK_STREAM; addr_hint.ai_protocol = IPPROTO_TCP; if(GetAddrInfoW(L"www.google.de", L"80", &addr_hint, &addr_info) || !addr_info) throw net_error("Could not dissolve DNS name: Server unknown!"); sockaddr_in* saddr_in = reinterpret_cast<sockaddr_in*>(&addr_info); std::cout << inet_ntoa(saddr_in->sin_addr) << std::endl; // 204.204.204.204 FreeAddrInfoW(addr_info);Woran kann das liegen?
-
sockaddr_in* saddr_in = reinterpret_cast<sockaddr_in*>(&addr_info);
das kann ja nicht gehen, eine addrinfo struktur ist keine sockaddr_in struktur[quote]
-
Danke dir, das habe ich Nachts einfach nicht mehr gesehen! Die richtige Zeile lautet:
sockaddr_in* saddr_in = reinterpret_cast<sockaddr_in*>(addr_info->ai_addr);
-
Ich habe noch eine andere Frage:
Gibt es irgendeine Möglichkeit mit Winsock 2 Unicode zu senden/empfangen? Ich sehe immer nur WSABUF, WSASend etc. ohne "W". Wie kann ich nun z.B. deutsche Umlaute per Socket (also als char-String) versenden?
-
winsock wird deine daten nicht interpretieren. einfach alles nach char* casten
-
Ja aber ich kann doch nicht einfach wchar_t nach char casten, X Bytes in eins casten ergibt doch Informationsverlust, oder?
-
Ad aCTa schrieb:
Ja aber ich kann doch nicht einfach wchar_t nach char casten, X Bytes in eins casten ergibt doch Informationsverlust, oder?
Nö, du veränderst ja nicht die Daten, nur den Zeiger.
Das könnte zb so aussehen:
int SendString(const wstring& data) { return send(s, reinterpret_cast<const char*>(data.c_str()), data.length() * sizeof(wchar_t), 0); } wstring ReceiveString(size_t amountCharacters) { vector<wchar_t> buffer(amountCharacters); recv(s, reinterpret_cast<char*>(&buffer[0]), buffer.size() * sizeof(wchar_t), 0); return wstring(&buffer[0]); }
-
Leider klappt das nicht so recht.

/* Zusatzinfos */ WSABUF buf_; std::vector<Ch> mem_; // Problemcode template <typename Ch, typename Tr> void basic_sockbuf<Ch, Tr>::initialize_(unsigned long n) { std::memset(&mem_[0], 0, mem_.size()); std::memset(&buf_, 0, sizeof(WSABUF)); std::memset(&overlapped_, 0, sizeof(WSAOVERLAPPED)); setp(&mem_[0], &mem_[0] + (n * sizeof(Ch)) - (1 * sizeof(Ch))); buf_.buf = reinterpret_cast<char*>(&mem_[0]); buf_.len = n * sizeof(Ch); // noch weiteres...Beim Versenden wird nur das erste Byte aus dem Puffer gelesen. Guck ich mir das im Debugger an, so zeigt er mir bei buf_.buf nur das erste Element an, aber nicht den ganzen Speicherblock. Ich versteh das nicht.