Overlapped I/O mit Winsock



  • Hallo! Ich schaue mir gerade etwas Overlapped I/O an und bin auf etwas Code gestoßen, den ich zwar nachvollziehen kann, aber nicht verstehe, warum es so klappt:

    typedef struct _SOCKET_INFORMATION {
         WSAOVERLAPPED overlapped;
         SOCKET socket;
         char buffer[DATA_BUFSIZE];
         WSABUF data_buf;
         DWORD send_bytes;
         DWORD recv_bytes;
    } SOCKET_INFORMATION, *LPSOCKET_INFORMATION;
    // ...
    SOCKET_INFORMATION SocketInfo;
    init(SocketInfo);
    
    WSARecv(SocketInfo->Socket, &(SocketInfo->DataBuf), 1, &RecvBytes, &Flags, &(SocketInfo->Overlapped), WorkerRoutine);
    
    // ...
    
    void CALLBACK WorkerRoutine(DWORD error, DWORD transferred_bytes, WSAOVERLAPPED* overlapped, DWORD flags) {
         // ...
         SOCKET_INFORMATION* SI = (SOCKET_INFORMATION*) overlapped; // What the hell?!
         // ...
         std::cout << SI->data_buf << std::endl; // die erhaltenen Daten ausgeben
    }
    

    Wieso funktioniert das auch noch? Einfach das Overlapped auf eine eigene Struktur umcasten. Die ist ja scheinbar genauso groß, aber dass dann auch da drin auf die richtigen Bytes die Informationen gelegt werden, verstehe ich nicht. WSAOVERLAPPED hat doch intern einen ganz anderen Aufbau, der immer nur als reserved bezeichnet wird?!
    Bitte Hilfe! 🙂
    Wo ich das her habe?
    http://www.winsocketdotnetworkprogramming.com/winsock2programming/winsock2advancediomethod5g.html



  • Ich würde das als Hack bezeichnen. Es geht weil overloapped der erste Member des structs ist. Die Adresse des 1. Members ist gleich der Adresse des Gesamten structs.

    Nur als Hinweis: Deine SOCKET_INFORMATION Instanz muss solange leben, bis die Receive Operation complete ist.

    Simon



  • Ah ja, das ergibt Sinn, danke! 🙂


Log in to reply