Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
1 / 1 / 2
Регистрация: 22.04.2013
Сообщений: 132

Почему виснет recv?

16.01.2014, 22:54. Показов 2512. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не могу понять почему у меня в клиентской части программы виснет приём данных? Если выполнять всегда только 1у итерацию, то всё принимается нормально. Сервер скачан с инета Home ftp server

C
1
2
3
4
5
6
7
8
9
int done = 0;
int bytes_read = 0;
char buf[1024] = {" "}; 
 
while (!done){
bytes_read = recv(socket, buf, sizeof(buf), 0);
// Вывод куда-то полученных данных
if (bytes_read == 0) done = 1;
}
Виснет сразу как всё считает, а должен выдать 0 (проверял и на -1). Может где-то нужно какой-то флаг поставить (не ждать долго, если нет данных) или типо того?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.01.2014, 22:54
Ответы с готовыми решениями:

Почему функция recv() возвращает 0?
Вроде бы, она возвращает либо -1, либо количество принятых байт. Я отправляю сообщения от браузера на самодельный сервер, там сообщения...

Почему при ответе на пакет ( recv / send ) скорость очень сильно падает ?
Добрый день. Объясните, пожалуйста, в чем дело ? Драйвер на основе примера mux из WinDDK передает, и принимает пакеты на большой...

Почему виснет!
Всем доброго дня! У меня стоит windows xp home sp2 а комп Msi wind u100 1gb ram 1.6 ghz 128 video! Так вот всем дело! У меня он...

5
 Аватар для Dizark
25 / 25 / 16
Регистрация: 12.04.2013
Сообщений: 85
16.01.2014, 23:05
если сокет открыт как SOCK_STREAM, то 0 байт примется только в том случае, если другая сторона закроет соединение (если точнее - передаст по TCP протоколу флаг FIN). Если у вас нет приема закрытия соединения, значит сервер не хочет его закрывать по каким-либо причинам.

А если соединение открыто как SOCK_DGRAM (ну и тем более как SOCK_RAW) то 0 байт и не получите.
2
1 / 1 / 2
Регистрация: 22.04.2013
Сообщений: 132
16.01.2014, 23:42  [ТС]
У меня SOCK_STREAM. А что значит "нет приема закрытия соединения". У меня такого нет. Как его сделать? Сколько примеров в интернете просмотрел, нигде ничего дополнительно не делается, даже в учебниках просто ждут 0.
0
 Аватар для Dizark
25 / 25 / 16
Регистрация: 12.04.2013
Сообщений: 85
17.01.2014, 00:15
Закрыть соединение - это сделать close (socket), где socket - это дескриптор активного соединения.
Ваш сервер должен по завершению передачи данных закрыть это соединение.

т.е. например алгоритм серверного приложения.

1. открыть слушающий сокет на входящие соединения (listener)
2. при подключении клиента - сделать accept на другой сокет, например sck1
3. передать данные в этот сокет
4. закрыть соединение close (sck1). именно при этом вызове, на клиентской стороне функция recv вернет, что она приняла 0 байт.

при этом слушающий сокет остается открытым и готов к подлючению следующего клиента
0
1 / 1 / 2
Регистрация: 22.04.2013
Сообщений: 132
17.01.2014, 23:49  [ТС]
Спасибо за разъяснение. Примерно так и представлял.

Разобрался. Оказалось ftp сервер работает немного отлично от других серверов. По командному порту 21 он отправляет только команду и соединение не разрывает, следовательно и не шлёт 0. А вот по сокету для данных в конце шлёт 0, т.к. после передачи разрывает соединение.
Сделал 2 разных функции для приёма данных и для приёма команд от сервера, теперь всё ок.

Спасибо за помощь.
0
Z3JheSBoYXQ=
 Аватар для fanatdebian
342 / 237 / 83
Регистрация: 08.07.2012
Сообщений: 577
21.01.2014, 21:26
Цитата Сообщение от igrok-vip Посмотреть сообщение
Спасибо за разъяснение. Примерно так и представлял.

Разобрался. Оказалось ftp сервер работает немного отлично от других серверов. По командному порту 21 он отправляет только команду и соединение не разрывает, следовательно и не шлёт 0. А вот по сокету для данных в конце шлёт 0, т.к. после передачи разрывает соединение.
Сделал 2 разных функции для приёма данных и для приёма команд от сервера, теперь всё ок.

Спасибо за помощь.
Сервер - это родитель, и он и не должен ничего слать на разрыв соединения. Его задача обработать подключение посредством выделение треда(как правило)/форка(реже) и все. Обработка сессии с клиентом занимается тред/форк. Он же (тред/форк) осуществляет чтение/запись данных с сокета и соответственно закрывает сессию.

зы. Камер Стивенс, "Сети TCP/IP Разработка приложение клиент/сервер Linux/Posix" подробно разжевана данная тема.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.01.2014, 21:26
Помогаю со студенческими работами здесь

Почему виснет программа
Почему при отправке запроса, и получении результата посредством IdHTTP программа виснет? И можно ли это исправить?

почему виснет браузер
<?php error_reporting(E_ALL & ~E_NOTICE); // Путь к каталогу $path = "путь_к_директории_назначения/"; //...

Почему программа виснет
Ввожу значения жму считать и программа виснет наглухо, знающие люди гляньте код может есть какие то явные ошибки а я днище их не вижу. Вот...

Почему виснет программа?
Здравствуйте! Я написала программу, которая находит элементы по 1 и 2 заданию в динамическом массиве, размерность которого регулируется с...

почему комп виснет
он очень сильно виснет у меня виндоус 7 максимальная не могу хоть что зделать грузится пол часа у меня пентиум 3 озу у мя 256мб я и комп...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru