Настройка ввода-вывода на сокете

У меня есть программа на C++, в которой я подключаюсь к своему серверу через сокет, и мне нужно установить перекрытие для сокета. Не работает следующее:

Функция

int set_wsa_proxy_client ( proxy_client *node ) {
    WSABUF  wbuf;
    DWORD   bytes, flags;
    int BufLen = 1024;
    wbuf.buf = node->buf;
    wbuf.len = node->len;
    flags = 0;
    int rr = WSARecv ( node->s , &wbuf , 1 , &bytes , &flags , &node->ov , NULL );

    if (rr == FALSE) {
        if (WSAGetLastError() != WSA_IO_PENDING) {
            printf("PostRecv: WSARecv* failed: %d\n", WSAGetLastError());

            if ( WSAGetLastError() == ERROR_SUCCESS ) { // this means it completed right away ...
                //cout << endl << "ERROR_SUCCESS - set_wsa_lobby_client completed" << endl;
                //cout << endl << "BYTES: " << node->len << endl;
                return 0;
            }
            return WSAGetLastError();
        }
    }
    return 0;
}

Расширение

typedef struct OverlappedEx : OVERLAPPED {
int id;
} OverlappedEx;

структура proxy_client

struct proxy_client {
    // ... blah blah blah
    SOCKET s;
    OverlappedEx ov;
    // ... blah blah blah
}

Главная

HANDLE ServerCompletionPort = CreateIoCompletionPort ( INVALID_HANDLE_VALUE , NULL , (ULONG_PTR)NULL , 0 );
if ( ServerCompletionPort == NULL ) { fprintf( stderr , "CreateIoCompletionPort failed: %d\n" , GetLastError() ); return -1; }

proxy_client *new_c = new proxy_client;
memset(&new_c->ov , 0 , sizeof(new_c->ov));
new_c->ov.hEvent = ServerCompletionPort;
new_c->s = (make socket)

// ... Connect and other stuff ...

HANDLE hrc = CreateIoCompletionPort( (HANDLE)new_c->s, new_c->ov.hEvent, (ULONG_PTR)pc,  0 ); // pc is the global struct of proxy_client
if (hrc == NULL)
    fprintf(stderr, "CompletionThread: CreateIoCompletionPort failed: %d\n", GetLastError());

int r = 0;
if ( ( r = set_wsa_proxy_client ( new_c ) ) != 0 ) {
    //
} else {
    //
}

Похоже, что это не запускает сокет, когда я GetQueuedCompletionStatus для ServerCompletionPort после отправки данных сокета (с сервера). Мне было интересно, как я могу установить ввод-вывод для сокета! Спасибо за помощь! :-)


person User    schedule 19.09.2012    source источник
comment
Взгляните на этот вопрос: stackoverflow.com/questions/754068/   -  person Nikolai Fetissov    schedule 20.09.2012
comment
Мое любопытство по поводу определения server_client просто разъедает меня. Кроме того, по какой-то конкретной причине вы устанавливаете обработку IOCP для того, что кажется членом hEvent структуры OVERLAPPED? Я бы начал с этого.   -  person WhozCraig    schedule 20.09.2012
comment
@CraigNelson Мне очень жаль. Это была опечатка. :( Штопать.   -  person User    schedule 20.09.2012