Bagaimana membedakan operasi mana yang diselesaikan di thread pemrosesan IOCP?

Aplikasi saya dapat mengirim dan menerima data secara bersamaan dari klien menggunakan WSASend dan WSARecv. Jadi, Bagaimana membedakan operasi mana yang diselesaikan di thread pemrosesan IOCP (kirim atau terima)?

BOOL bReturn = GetQueuedCompletionStatus(srv.m_hCompPort, &dwBytesTransfered, (LPDWORD)&lpContext, &pOverlapped, INFINITE);

Saya pikir saya bisa menggunakan struktur OVERLAPED untuk tujuan ini, tapi ternyata tidak bisa. Ada ide?

Terima kasih!


person Tutankhamen    schedule 14.06.2013    source sumber


Jawaban (1)


Solusinya sangat sederhana:

struct iOverlaped : public OVERLAPPED{
    enum Type {
        Send,
        Receive
    };
    iOverlaped(Type type_ ) {
        ZeroMemory(this, sizeof(iOverlaped));
        type = type_;
    }

    Type type;
};

Dan untuk setiap koneksi kita harus membuat dua instance yang tumpang tindih (satu untuk setiap jenis operasi) ...

person Tutankhamen    schedule 14.06.2013
comment
Sebenarnya Anda harus membuat satu instance yang tumpang tindih per operasi yang akan aktif secara bersamaan. Jadi, jika Anda hanya mengeluarkan pembacaan dari penyelesaian penulisan dan penulisan dari penyelesaian baca, maka Anda hanya memerlukan satu. Jika Anda dapat mengeluarkan beberapa proses baca dan tulis secara bersamaan maka Anda memerlukan satu struktur yang tumpang tindih untuk setiap baca dan tulis agar dapat aktif. Poin utamanya adalah bahwa struktur yang tumpang tindih adalah data per operasi dan bertahan selama durasi operasi dan harus unik untuk setiap operasi aktif. - person Len Holgate; 15.08.2013