Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > Ассинхронными сокетами и WSAEvent


Автор: dvamaster 16.8.2007, 06:33
Доброго времени суток!!!

У меня проблема с ассинхронными сокетами.

WaitForSingleObject реагирует только на FD_ACCEPT.

Можете подсказать что сделать?

Вот код

Код

SOCKET sockListen;
sockaddr_in addrListen;
WSAEVENT wsaEvent;
WSANETWORKEVENTS wsaNWE;

int _tmain(int argc, _TCHAR* argv[])
{
    WSADATA wsaData;
    u_long iNonBlockMode = 1;

    int iRet = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iRet != 0)
        return -1;
    sockListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sockListen == INVALID_SOCKET) {
        WSACleanup();
        return -1;
    }
    memset(&addrListen, 0, sizeof(addrListen));
    addrListen.sin_addr.s_addr = INADDR_ANY;
    addrListen.sin_family = AF_INET;
    addrListen.sin_port = htons(9876);
    iRet = bind(sockListen, (struct sockaddr*)&addrListen, sizeof(addrListen));
    wsaEvent = WSACreateEvent();
    iRet = listen(sockListen, 5);
    iRet = ioctlsocket(sockListen, FIONBIO, &iNonBlockMode);
    iRet = WSAEventSelect(sockListen, wsaEvent, FD_ALL_EVENTS);
    DWORD waitRet = 0;
    bool bRunLoop = true;
    while (bRunLoop) {
        waitRet = WaitForSingleObject(wsaEvent, WSA_INFINITE);
        if (waitRet == WSA_WAIT_TIMEOUT)
            break;
        if (waitRet != WSA_WAIT_EVENT_0)
            break;
        WSAEnumNetworkEvents(sockListen, wsaEvent, &wsaNWE);
        switch (wsaNWE.lNetworkEvents) {
            case FD_ACCEPT:
                break;
            case FD_READ:
                break;
            case FD_CLOSE:
                bRunLoop = false;
                break;
        }
        WSAResetEvent(wsaEvent);
    }
    WSACloseEvent(wsaEvent);
    iNonBlockMode = 0;
    iRet = ioctlsocket(sockListen, FIONBIO, &iNonBlockMode);
    WSACleanup();
    return 0;
}

Автор: ptr 16.8.2007, 11:20
А что ты ещё хочешь получить? Ведь ты ничего больше не делаешь, только прослушиваешь порт.

Автор: dumb 16.8.2007, 12:21
Цитата(dvamaster @  16.8.2007,  06:33 Найти цитируемый пост)
Можете подсказать что сделать?

accept'нуть входящее соединение?

Автор: dvamaster 16.8.2007, 13:16
Кусок из DRKB3

Код

var
fevent : thandle;
//Создаем серверный сокет
...
feventclose := wsacreateevent;
wsaeventselect(socket,fevent, fd_close + fd_read );
repeat
waitforsingleobject(fevent,infinite);
wsaenumnetworkevents(fsocket,fevent,@ni);
case ni.lnetworkevents of
fd_close:break;
fd_read: begin
receivedata;
end;
end;
wsaresetevent(feventclose);
until false;
wsacloseevent(feventclose);


мне казалось, надо что-то другое сделать с Accept`ом? что правла не знаю, подскажите.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)