char text[1024];
// Создаем сокет
s = socket(AF_INET, SOCK_STREAM, 0);
if (s == INVALID_SOCKET)
{
MessageBox(NULL, "Error in socket(...)", "SMTPOP", MB_OK);
return false;
};
...
// Заполняем параметры адреса.
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = *((unsigned long *)d_addr->h_addr);
addr.sin_port = htons(110); // POP3
// УСТАНАВЛИВАЕМ соединение.
if (SOCKET_ERROR == (connect(s, (sockaddr *) &addr, sizeof (addr)))){
MessageBox(NULL, "Error in connect(...)", "SMTPOP", MB_OK);
return false;
};
...
send(s, text, "RETR 1", 0);
int FDest;
FDest = _open(fName, _O_BINARY|_O_TRUNC|_O_WRONLY|_O_CREAT,
_S_IREAD|_S_IWRITE );
result = recv(s, text, sizeof(text), 0);
while(strncmp(text, "\r\n.\r\n", 5) != 0)
{
_write(FDest, text, result);
result = recv(s, text, sizeof(text), 0);
}
POP3: завершение приёма письма.
Мне нужно получить письмо. Делаю так:
Код:
Так вот у меня на компьютере письмо получается нормально. Нормально получается и на другом компьютере где стоит Visual Studio. Но не работает на компьютерах где нет студии - зависает в цикле на команде recv. При этом всё письмо записывается в файл, а вот ответ от сервера "\r\n.\r\n" почему-то не приходит. В чём дело, какое правильное условие для завершения приёма письма?
Код:
char text[1024] = {0};
// Создаем сокет
s = socket(AF_INET, SOCK_STREAM, 0);
if (s == INVALID_SOCKET)
{
MessageBox(NULL, "Error in socket(...)", "SMTPOP", MB_OK);
return false;
};
...
// Заполняем параметры адреса.
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = *((unsigned long *)d_addr->h_addr);
addr.sin_port = htons(110); // POP3
// УСТАНАВЛИВАЕМ соединение.
if (SOCKET_ERROR == (connect(s, (sockaddr *) &addr, sizeof (addr)))){
MessageBox(NULL, "Error in connect(...)", "SMTPOP", MB_OK);
return false;
};
...
send(s, text, "RETR 1", 0);
int FDest;
FDest = _open(fName, _O_BINARY|_O_TRUNC|_O_WRONLY|_O_CREAT,
_S_IREAD|_S_IWRITE );
while((result = recv(s, text, sizeof(text), 0)) > 0)
{
int rn = strstr(text+strlen(text)-5, "\r\n.\r\n") != NULL ? strstr(text+strlen(text)-5, "\r\n.\r\n") - text : -1;
if(rn != -1){
text[rn+1] = '\0';
_write(FDest, text, rn+1);
break;
}
_write(FDest, text, result);
}
// Создаем сокет
s = socket(AF_INET, SOCK_STREAM, 0);
if (s == INVALID_SOCKET)
{
MessageBox(NULL, "Error in socket(...)", "SMTPOP", MB_OK);
return false;
};
...
// Заполняем параметры адреса.
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = *((unsigned long *)d_addr->h_addr);
addr.sin_port = htons(110); // POP3
// УСТАНАВЛИВАЕМ соединение.
if (SOCKET_ERROR == (connect(s, (sockaddr *) &addr, sizeof (addr)))){
MessageBox(NULL, "Error in connect(...)", "SMTPOP", MB_OK);
return false;
};
...
send(s, text, "RETR 1", 0);
int FDest;
FDest = _open(fName, _O_BINARY|_O_TRUNC|_O_WRONLY|_O_CREAT,
_S_IREAD|_S_IWRITE );
while((result = recv(s, text, sizeof(text), 0)) > 0)
{
int rn = strstr(text+strlen(text)-5, "\r\n.\r\n") != NULL ? strstr(text+strlen(text)-5, "\r\n.\r\n") - text : -1;
if(rn != -1){
text[rn+1] = '\0';
_write(FDest, text, rn+1);
break;
}
_write(FDest, text, result);
}
Код:
while(strncmp(text, "\r\n.\r\n", 5) != 0 &&
strncmp(&text[strlen(text) - 5], "\r\n.\r\n", 5) != 0)
{
_write(FDest, text, result);
result = recv(s, text, 1024, 0);
}
strncmp(&text[strlen(text) - 5], "\r\n.\r\n", 5) != 0)
{
_write(FDest, text, result);
result = recv(s, text, 1024, 0);
}
Цитата: bdv1983
Пока сделал так:
Код:
while(strncmp(text, "\r\n.\r\n", 5) != 0 &&
strncmp(&text[strlen(text) - 5], "\r\n.\r\n", 5) != 0)
{
_write(FDest, text, result);
result = recv(s, text, 1024, 0);
}
strncmp(&text[strlen(text) - 5], "\r\n.\r\n", 5) != 0)
{
_write(FDest, text, result);
result = recv(s, text, 1024, 0);
}
В таком варианте последняя строка в письме не записывается в файл