![]() |
|
Модераторы: xvr |
![]()
|
|
| admsasha |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: 1 Всего: 6 |
создаю подлючение, всё хорошо, но, если сервер отдает данные во время sleep то данные, теряются, как этого избежать ? |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 5 Всего: 134 |
Использовать select? Типа того:
PS. Странно, у меня клиент нормально работал и с sleep+read. Правда сервер передает 5 байт каждую секунду, а клиент делает sleep(5). Но все равно - select рулит Это сообщение отредактировал(а) Mayk - 31.5.2005, 13:48 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| GrayCardinal |
|
|||
|
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
admsasha
Ничего не понимаю. Нафиг sleep в твоем коде. ? Я так понимаю (и если не ошибаюсь, давно серваки не писал Да и так делать printf нельзя. Что будет если получишь 1024 "N" ?
Это как ? Добавлено @ 08:02 ЗЫ ИМХО, char buf[1024] убери с глаз на... лучше не привыкать так делать... Это сообщение отредактировал(а) GrayCardinal - 2.6.2005, 08:03 |
|||
|
||||
| admsasha |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: 1 Всего: 6 |
я привел самый простой пример, что бы показать код, а не 1000 строк моего истинного кода кстате, как делать проверку на переполнения буфера ?, и как правильно писать, вместо "printf" ?
а как правильно ?
это значит что если данные посылаю во вреся sleep то нечего в buf не появляется...., а sleep`ом я эмитировал долгую работу.... типа отрабатываются данные 5 секунд... |
||||||
|
|||||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 5 Всего: 134 |
Если данные долго обрабытываются, то
1) здравствуйте, потоки(см. в сторону pthread_create) 2) здравствуй, вилка(см. fork)
да хотя бы char buf[1025]; buf[1024]=0; printf("%s\n",buf); Только вот вопрос - а ты уверен, что тебе придут 1024 байт? А не два пакета по 512 байт? У тебя это где нибудь обрабатывается? ЗЫ. GrayCardinal, чем вызвана твоя нелюбовь к стеку? Это сообщение отредактировал(а) Mayk - 2.6.2005, 13:34 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| admsasha |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: 1 Всего: 6 |
так получается что переполнение будет при 1025 ??
вот распалерирования мне как раз не надо... только пошаговые действия
нет не уверен, и так часто бывает, но это обрабатываю.... точнее обхожу неправильным путем.... |
||||||
|
|||||||
| Mayk |
|
||||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 5 Всего: 134 |
Ничуть, если мы будем recv'ить по 1024 байта: buf[0...1023]: пришедшие байты buf[1024]: нуль В итоге printf() скорее завершится даже если тебе придет 1024 букв 'N'.
Ну так пускай тогда вторая сторона ждет пока первая сторона не скажет "готово, данные обработаны".
Кроме очевидных решений, можно посмотреть в сторону опций сокетов: SO_RCVLOWAT - минимальное кол-во данных в приемном буфере сокете, при наличии который функция select скажет "сокет готов для чтения", а функция read вообще вернется(она заблокируется пока трубеумое кол-во не придет). По умолчанию SO_RCVLOWAT равен 1. Разумеется стоит посмотреть, чтобы размер приемного буфера(опция SO_RECVBUF) вмещал требуемое кол-во данных. Только вот - SO_RECVBUF следует устанавливать ДО коннекта, а SO_RCVLOWAT когда хошь. Этакий "T/TCP - TCP для транзацкций - своими руками" Это сообщение отредактировал(а) Mayk - 2.6.2005, 15:46 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||||
|
|||||||
| admsasha |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: 1 Всего: 6 |
Mayk
можно полный пример ? Не могу найти в инете про select.... |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 5 Всего: 134 |
Хмм, "$ man select". А вообще google
молодец(хоть и на msdn отсылает все время) - вот здесь в кратце описан select и не только. А пример можно:
Вот это вот работает. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| admsasha |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: 1 Всего: 6 |
не думал что man есть на команды C++
у меня тоже работает... но при sleep все равно такой же эффект вот вставь в цикл sleep(5), и шли данные 1,2,3,4,5,6,7,8.... 1000.... и увидешь потерю... |
||||
|
|||||
| GrayCardinal |
|
||||||||
|
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
Ничем не вызвана. Просто добрый совет был Можно и так, конечно НО лучше бы
Извини конечно, но по моему после таких вопросов... Всю тыщу надо будет переписывать
задолбал |
||||||||
|
|||||||||
| admsasha |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: 1 Всего: 6 |
не спорю, я только учусь
не по TCP, а от неправильного кода...
незнаю что уж она делает, но не помогает... |
||||||
|
|||||||
| GrayCardinal |
|
|||
|
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
Шоб тебя. Можно "не рабочий" сервак и "не рабочий клиент" в студию ?! или хотябы мне [email protected]
|
|||
|
||||
| admsasha |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: 1 Всего: 6 |
всё, кажется сам разобрался, когда упрощал код, для показа... ну жалко мне исходники показывать
вот тут ошибка и получалась.
клиент использовал этот
сервер:
Добавлено @ 08:58
как сделать один, если не известна длина ? |
||||||||
|
|||||||||
| admsasha |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: 1 Всего: 6 |
Как я понял менять значения нельзя ? |
||||
|
|||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |