LINUX.ORG.RU

recv()


0

0

Здравствуйте. Мне непонятен один момент при работе с с этой функцией - допустим идет у меня работа с тем же смтп, т.е. конектюсь к серверу, и жду от него ответ (220...), но как я понимаю, к моменту вызова recv данные могу не придти, и recv ничего не вернет ? А если нет, то она будет ждать поступления данных до таймаута, а какой объем данных она будет ждать? Все что послал сервер ?

Вообще как правильно организовать работу с сокетом ? Пока у мен тупо connect(), recv(), send(), recv() (с проверкой возвращаемых значений). Мне кажется, что нужно при recv использовать select, и когда она скажет,, что пришли данные - вызвать recv. Или это я что-то ненужное нагорожу ?

Просто в таком вие, как я описал, не всегда кореектно посылаются данные...

Заранее спасибо за помощь

anonymous

Ты скорее всего используешь блокирующий режим сокета. Т.е. твоя программа ждет внутри ф-ии recv() пока не придет сколько-нибудь данных(не до таймаута, а сколько нужно).
А вообще прочитай наконец man recv ;)

anonymous
()
Ответ на: комментарий от anonymous

Передал функции recv() флаг MSG_WAITALL, стало медленее, но без глюков..

anonymous
()
Ответ на: комментарий от anonymous

в тривиальных случаях можно обойтись без select. он обычно рулит когда тебе надо одной прогой одновременно отслеживать несколько ФД. Так вот чтобы лишний раз не лезть при помощи recv() на пустой ФД а заниматся делом можно заюзать select().

cvv ★★★★★
()
Ответ на: комментарий от anonymous

Потому что на ето уйдёт ОЧЕНЬ много времени. БОЛЬШЕ чем 101 таймаут. а при помощи select ты имееш возможность опросить все 101 соединение за время приблизительно равное двум таймаутам.

PS: здесь я немного утрирую.

cvv ★★★★★
()
Ответ на: комментарий от cvv

А ну да, так то ессно, я просто не совсем понял. :) Все равн спасибо. Но мне нечего делать, кроме того как ждать данных ...

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.