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 ожидает и весит. как сделать. Что бы по истеччении какого-то таймаута он выходил из цикла.
Тут есть описание работы с 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");
}
{
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");
}
{
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");
}