>
>>Нули то зачем серверу слать? :))) В send(sock,user,sizeof(user),0); вместо "sizeof(user)"
>>используйте "sizeof(user)-1" Тоже касается и send(sock,pass1,sizeof(pass1),0)
>
>2Soldier:Спасибо,так работает - т.е либо sizeof(user)-1 либо strlen(user)
> Но что мне делать ,когда я посылаю ему LIST,в ответ он
>мне шлет несколько строк?
>Конструкция типа
>
>while(1) {
>
>int h=recv(s,p,512,0);
>if(h==0) { break;}
>printf("%s \n",p);
>
>}
>
>не работает,т.е прога ждет данных....может пометить сокет как неблокирующий?
Короче, если не хочется делать poll/select-демультиплексор и писать собственный коллектор строк, то перемапливаем наш сокет на буферизованный файл (внимание, в виндах не прокатит!):
FILE * myfd = fdopen(s, "r+");
Потом шлем туда коммандные строки инструкциями вроде:
fprintf(myfd, "LIST\r\n");
И построчно принимаем ответы:
char tmp_buf[1001]={0};
while(fgets(tmp_buf, 1000, myfd)!=NULL)
{
Чего-то творим со строкой tmp_buf, не забывая что она в конце имеет "\r\n"
}
Теперь опеределяемся с LIST. Во первых, LIST сообщает, сколько она хочет отдать строк, во вторых, заканчивает вывод строкой ".\r\n":
C: LIST
S: +OK 2 messages (320 octets)
S: 1 120
S: 2 200
S: .
Т.е. у нас 2 пути - либо парсим первую строку ответа, выясняя (в данном примере) что у нас именно "2" messages и потом считываем 2 строки и одну (которая ".\r\n") скипаем, либо скипаем первую, а потом читаем до точки.
Первый вариант:
fprintf(myfd, "LIST\r\n");
char tmp_buf[1001]={0};
char msg_count_buf[1001]={0};
fgets(msg_count_buf, 1000, myfd);
int msg_count = parse_list_answer(msg_count_buf);
for (int i=0; i<msg_count; i++)
{
fgets(tmp_buf, 1000, myfd);
Обрабатываем сообщения
}
fgets(tmp_buf, 1000, myfd); //Сбрасываем точку
Второй вариант:
fprintf(myfd, "LIST\r\n");
char tmp_buf[1001]={0};
fgets(tmp_buf, 1000, myfd); //Скипаем служебный ответ
while(fgets(tmp_buf, 1000, myfd)!=NULL)
{
if (strcmp(tmp_buf, ".\r\n") break;
Чего-то творим со строкой tmp_buf, не забывая что она в конце имеет "\r\n"
}
Короче, почитай спецухи по POP3, по работе с потоками ввода-вывода и по работе со строками - сразу полегчает. Хотя по уму нужно не ремапить сокет на файл (это не очень правильное и переносимое решение, хоть и быстрое), а написать свой сетевой демультиплексор и коллектор строк.
|