Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

условие выхода из цикла

12K
27 ноября 2009 года
Killer-App
5 / / 07.10.2005
 
Код:
void get_message(SOCKET sok, char *text)          
{
 int c,i=0;
 
 while(recv(sok,text,strlen(text),0))
 {  
    printf("%s",text);
 }
 printf("сообщения закончились:\n");
}

Соединяюсь на POP3 сервер и принимаю сообщения пока они идут, когда они заканчиваются, то recv ожидает и весит. как сделать. Что бы по истеччении какого-то таймаута он выходил из цикла.
2.2K
28 ноября 2009 года
REFOT
181 / / 08.04.2005
Ты сам, анализируя данные должен определить, что приём почты закончен, после чего послать серверу команду QUIT и закрыть соединение.

Тут есть описание работы с POP3 сервером: http://www.codenet.ru/webmast/pop3.php

Бывают ситуации, когда связь с сервером вдруг по каким-то причинам не штатно рвётся и recv довольно долго весит, не зная, что соединения уже нет. В таком случае можно выставить timeout на приём данных, можно проверить соединение с сервером используя KeepAlive или просто что-то послав серверу через send.

timeout:
Код:
bool IsReadData(sock, sec)
{
   fd_set readfds;
   FD_ZERO(&readfds);
   FD_SET(sock,&readfds);
   TIMEVAL tv;
   tv.tv_sec = sec;
   tv.tv_usec = 0;

   select(1, &readfds, NULL, NULL, &tv);
   if(FD_ISSET(sock, &readfds)) return true;
   return false;
}

void get_message(SOCKET sok, char *text)          
{
   int c,i=0;
   while(IsReadData(sok, 5) && recv(sok,text,strlen(text),0))
   {  
      printf("%s",text);
   }
   printf("сообщения закончились:\n");
}



keepalive:
Код:
void get_message(SOCKET sok, char *text)          
{
   tcp_keepalive alive;
   DWORD dwRet, dwSize;
   alive.onoff = 1;
   alive.keepalivetime = 5000;
   alive.keepaliveinterval = 1000;
   dwRet = WSAIoctl(sok, SIO_KEEPALIVE_VALS, &alive, sizeof(alive),NULL, 0,
   reinterpret_cast<DWORD*>(&dwSize), NULL, NULL);

   int c,i=0;
   while(recv(sok,text,strlen(text),0))
   {  
      printf("%s",text);
   }
   printf("сообщения закончились:\n");
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог