![]() |
|
Модераторы: Snowy, Poseidon, MetalFan |
![]()
|
|
| Antony41 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 27.12.2008 Репутация: нет Всего: 1 |
тоесть если я правильно понимаю, например допустим мне осталось принять 10 байт до полного пакета данных, а пришло 1000 байт (10 байт склееный со след. пакетом), и я сделаю вот так обработчик OnRead...
затем отправлю пакет на обработку, то при следующем вызове обработчика в Socket.ReceiveLength будут оставшиеся байты (990 байт) ? Добавлено через 2 минуты и 26 секунд тоесть если пришло 1000 байт а я буду читать по 1 байту Socket.ReceiveBuf(ReadBuf, 1); то обработчик будет вызываться 1000 раз? |
|||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 4 Всего: 41 |
Скажем так.
Твоя структура 200 байт Пришло 199 байт. Событие OnRead. Выделили память 4+200 В выделенную память записали 199 принятых байт и Integer=199 Пришло еще 399 байт Событие OnRead. В выделенную память дописали 1 байт Вызвали proc, передали принятую структуру. В выделенную память записали 200 байт Вызвали proc, передали принятую структуру. В выделенную память записали 198 байт и Integer=198 ждем еще. Добавлено через 5 минут и 53 секунды Че гадать, когда легко можно проверить.
-------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| Antony41 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 27.12.2008 Репутация: нет Всего: 1 |
Спасибо Вам огромное!
|
|||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 4 Всего: 41 |
Кроме того. Если ты не используешь устойчивое соединение, можешь прочитать сразу все данные в OnDisconnect.
-------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| Antony41 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 27.12.2008 Репутация: нет Всего: 1 |
Ребят вот еще какой вопрос. Сервак запущен в блочном режиме, и создаются отдельные потоки, в самом потоке прописана вот эта строка
И эта строка грузит мой цп на 25% при 1 подключенном клиенте, почему так как быть? |
|||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 4 Всего: 41 |
потому что процессор четырёхядерный
-------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| Antony41 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 27.12.2008 Репутация: нет Всего: 1 |
ну 4 и что, его хватит только на 4 потока... и потом цп будет загружен на 100%. как быть то чтоб не такой прожерливый был? Может быстро обрабатывать данные и выходить из потока, отключать клиента, а клиент будет слать серваку каждые например 30-40 сек команду что он на связи... серв же посчитает его отключенным только после 5 попыток поставит ему статус офлайн. А вот если выполняешь какой нибудь запрос от клиента то отсылать сразу его и если нужно соединиться например для передачи какого нибудь файла, стрима, затем снова отрубить.
|
|||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 4 Всего: 41 |
Ну самое простое, но неправильное, вставить в цикл sleep(100)
-------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| Antony41 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 27.12.2008 Репутация: нет Всего: 1 |
ну а правильное ?
|
|||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 4 Всего: 41 |
Ну вот посмотри.
Скомпилируй запусти, и введи в браузере http://localhost:3600/ -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 4 Всего: 41 |
Antony41, я заврался. Так тоже не годится.
Оно конечно работает, но через костыль. Это сообщение отредактировал(а) Чучмек - 18.2.2013, 11:39 -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| Чучмек |
|
||||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 4 Всего: 41 |
Antony41, советую разобраться с сокетами (API)
Вот как выглядит сервер на WinSock API. (без проверки ошибок)
p.s. T(Clent)ServerSocket всего лишь ООП обертка для WinSock API. Вот тоже на TServerSocket
p.p.s При закрытии, оба варианта будут ждать, пока не разорвется соединение. Только тогда recv/ClientSocket.ReceiveBuf вернет управление. Это сообщение отредактировал(а) Чучмек - 18.2.2013, 16:24 -------------------- умную мысль держи при себе, а дурной - поделись с другими |
||||
|
|||||
| Чучмек |
|
||||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 4 Всего: 41 |
Ответ один - внутри цикла нет, или не правильно используется функция ожидания. Например. TWinSocketStream.WaitForData возвращает управление если в сокете остались непрочитанные данные. TWinSocketStream - редкое г. Лучше не используй его. На мой взгляд - бесполезный компонент. В TWinSocketStream используются только read/write/WaitForData Если при остановке сервера необходимо сразу остановить все потоки (ClientSocket.Connected возвращает false)- вместо TWinSocketStream.WaitForData используй можно использовать
WaitForData(ClientSocket,timeout) -> true, если есть данные для чтения и false, если timeout Это сообщение отредактировал(а) Чучмек - 18.2.2013, 16:26 -------------------- умную мысль держи при себе, а дурной - поделись с другими |
||||
|
|||||
| Antony41 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 27.12.2008 Репутация: нет Всего: 1 |
||||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 4 Всего: 41 |
Да нет, должно работать. Возвращает true, если есть данные для чтения и false, если таймаут или ошибка. Однако если прочитано меньше чем пришло - всегда true и без ожидания. Один байт не прочитал - и будет твой поток грузится на 100%. -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
![]()
|
| Правила форума "Delphi: Сети" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |