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.


Anmelden zum Antworten