Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.01.2010, 19:41   #1
asdo
 
Регистрация: 23.01.2010
Сообщений: 4
По умолчанию Зацикливается recv.

Известно, что указанная при ошибке возвращает -1. Ошибку в данном случае вызывает разрыв соединения.
Код:
while(1){
reciv_bytes=recv(дискриптор сокета, буфер, длина, 0);
if(reciv_bytes<0) break;
}
Однако, описанный выше цикл не прерывается по условию поступления отрицательного значения от recv. Зато если заменить break на return, то вся функция успешно завершается (что свидетельствует все таки о выполнении условия). Однако по задумке функция завершаться не должна.
В чем причина такого поведения recv??
asdo вне форума Ответить с цитированием
Старый 23.01.2010, 20:55   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Return Value

If no error occurs, recv returns the number of bytes received and the buffer pointed to by the buf parameter will contain this data received. If the connection has been gracefully closed, the return value is zero.

Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.
Невероятно да ? Могу продолжить выдавать истину
BOBAH13 вне форума Ответить с цитированием
Старый 23.01.2010, 21:00   #3
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Код:
        while(1)
                {
                        byte_size_recv = recv(sClient, RecvBuff, sizeof(RecvBuff), 0);
                        if ((byte_size_recv != SOCKET_ERROR) && (strlen(RecvBuff) != 0))
                                frmClient->mmLog->Lines->Add(RecvBuff);
                }
Я сделал лично так.
profi вне форума Ответить с цитированием
Старый 23.01.2010, 21:12   #4
asdo
 
Регистрация: 23.01.2010
Сообщений: 4
По умолчанию

BOBAH13, благодарю за информацию )
asdo вне форума Ответить с цитированием
Старый 23.01.2010, 23:38   #5
crystalbit
ГОСТ 2.403-75
Пользователь
 
Аватар для crystalbit
 
Регистрация: 04.05.2009
Сообщений: 92
По умолчанию

Код:
reciv_bytes=1;
while(reciv_bytes!=0){
reciv_bytes=recv(дискриптор сокета, буфер, длина, 0);
if(reciv_bytes<0) break;
}
вроде как-то так в твоей конструкции
мой скромный delphi блог
crystalbit вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
recv() Артэс C/C++ Сетевое программирование 7 15.01.2010 14:51
WinSock (send, recv) AidarBik Работа с сетью в Delphi 1 27.07.2008 15:22