|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Andrey Ushakov 2:5020/400 20 Nov 2006 17:44:22 To : Valentin Davydov Subject : Re: sendfile system call in FreeBSD -------------------------------------------------------------------------------- Mon Nov 20 2006 11:29, Valentin Davydov wrote to Andrey Ushakov: VD> Дык, заверни на сервере read(2) в цикл и читай до тех пор, пока не вернёт VD> 0 либо ошибку. Hе получается так сделать. Дело в том что на этом диалог не завершается У меня дальше ещё вот: if((rc = recv(s, buf, sizeof(buf), MSG_WAITALL)) < 0) { printf("stcpcl: delivererd failed"); exit(1); } Я жду уведомления о доставке. Я пробовал после того как отправлю файл послать ещё маленькое сообщение серверу типа: if((rc = send(s, "endf", 4, 0)) < 0) { printf("stcpcl: ext send failed"); exit(1); } Hо цикл на сервере: while((rc = read(s1, okmsg, (u_int)sizeof(okmsg))) > 0) { for(i = 0; i != rc; i++) { buf[itemp + i] = okmsg[i]; } itemp += rc; } Почему-то воспринимает и данные передаваемого файла и последующего маленького сообщения как один и тот же поток. По моему это непрвильно. Либо это sendfile такой странный, либо я чё-то не понимаю =\ Вот тут код целиком, а то не оч понятно что происходит: Часть клиента: while(rc != -1 && filesize > 0) { rc = sendfile(fd, s, offset, 0, (struct sf_hdtr *) NULL, &sbites, 0); filesize -= sbites; offset += sbites; } /*посылаем маленькое сообщение if((rc = send(s, "endf", 4, 0)) < 0) { printf("stcpcl: send end file word failed"); exit(1); }*/ /*Можно не посылать этого сообщения, всё равно цикл на сервере включит его в поток от sendfile()*/ /*ожидаем уведомления о доставке*/ printf("ok recive start\n"); if((rc = recv(s, buf, sizeof(buf), MSG_WAITALL)) < 0) { printf("stcpcl: delivererd failed"); exit(1); } Часть сервера: while((rc = recv(s1, okmsg, /*(u_int)*/sizeof(okmsg), 0)) > 0) { /*if(rc == 4) { okmsg[5] = '\0'; if(!strcmp(okmsg, "endf")) break; }*//*это не поможет отловить маленькое сообщение в одном потоке, если только принимать данные кусками по 4 байта и не сравнивать каждый раз*/ for(i = 0; i != rc; i++) { buf[itemp + i] = okmsg[i]; } itemp += rc; } --- ifmail v.2.15dev5.3 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/1667922570e72.html, оценка из 5, голосов 10
|