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


Автор: mrbrooks 18.4.2008, 12:11
Комрады!
Написал консольный клиент который записывает инфу на сервак и получает ответ в случае успешной записи.  smile 
В случае если сервак загнулся (вся программа у меня зациклена) все начинается заново - клиент так и долбит пока не соединится. Но как то это не по людски.

Посиму я решил заюзать следующую идею:

Код

//мой предпологаемый алгоритм
..........
WSAStartup();
sockaddr.....
socket();
connect();
..........
WSANETWORKEVENTS fuck;
WSAEVENT wsaevent = WSACreateEvent();
WSAEventSelect(socket,  wsaevent, FD_ALL_EVENTS);

while(true)
      {
        DWORD res = WaitForMultipleObjects(1, &wsaevent,0,5000,0);
       switch(res)
                 {
                  case WSA_WAIT_TIMEOUT: printf("fuck side"); break;
                  case WSA_WAIT_EVENT_0:
                  WSAEnumNetworkEvents(socket, wsaevent, &fuck);
                  /*          switch (fuck)
                                          {
                                           case FD_READ:  
                                           case FD_CONNECT:   //эти события почему то не отлавливаются и я на них пока забил болт
                                           case FD_CLOSE:
                                           case FD_WRITE:
                                          }*/
                                     printf("good\n");
                 /*здесь идет send() и recv()*/
                                     Sleep(100);
                                     break;
                }
      }
........
closesocket();
WSACleanup();
........


Собственно так работает но как только связь рвется - вечный WSA_WAIT_TIMEOUT с сообщением "fuck side".
Скажите с помощью такого подхода можно восстановить соединение с серваком? (не такого конечно - но в духе объектов событий).



Автор: jonie 18.4.2008, 21:12
а ты попробуй открывать и закрывать соединение, а не держать его всегда открытым. и проблемы не будет.

Автор: mrbrooks 19.4.2008, 09:51
jonie это грубо говоря так:
Код

....
case WSA_WAIT_EVENT_0:
                                     printf("good\n");
                                     connect();
                                     send();
                                     recv();
                                     closesocket();
                                     Sleep(100);
                                     break;
....


я правильно мозгую  smile ?

Автор: jonie 19.4.2008, 12:40
ну типа того ) логика такая, да.
while(life) {
открыл, что надо передал, если надо прочел ответ, закрыл, спим.
 }

Автор: mrbrooks 21.4.2008, 11:46
хы. тогда зачем вообще нежны этисобытия если все можно сделать сугубо на сокетах?

Автор: mrbrooks 28.4.2008, 20:13
up. я конечно извиняюсь за новязчивость - но все таки кто нить поможет мне прояснить ситуцию. нужныли эти события или все как по старинке - с зацикливаемыми сокетами? smile 

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