![]() |
|
Модераторы: Snowy, Poseidon, MetalFan |
![]()
|
|
| Antony41 |
|
||||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 27.12.2008 Репутация: нет Всего: 1 |
впринципе переписал немного, получается что сервер работает в режиме blocking а клиент nonblocking, короче
проблемка такова: есть структура Record, и объект этой структуры GlobalData указатель на эту структуру fData: PData
теперь заполняю структуру
и отправлять её приходится непонятным пока образом. Вот так всё нормально принимается клинтом:
если вместо этого написать
то отчет клиента такой:
мне вот непонятно может быть эта строка всё таки верна?
Это сообщение отредактировал(а) Antony41 - 13.2.2013, 17:29 |
||||||||||||
|
|||||||||||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 4 Всего: 41 |
fData указатель. SizeOf = 4(8)
Добавлено @ 17:40 Пкажи fRSDataTWinSocketStream.Write Добавлено через 11 минут и 29 секунд
Это сообщение отредактировал(а) Чучмек - 13.2.2013, 17:41 -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 4 Всего: 41 |
Передаешь только первые 4 байта. Твоя структура принимается частями. Каждую часть, при приеме, ты считаеш новой структурой. -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| Antony41 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 27.12.2008 Репутация: нет Всего: 1 |
угу вот я тоже уже понял что это размер в памяти не структуры а указателя. Вот нифига не пойму
Структуры у меня одинаковы что в клиенте что на сервере размер фиксированный у обоих как их не заполняй. вот она структура собственно
Смотрите пакет мне приходит рубленый значит потоки байт данных передаются последовательно один за другим это так? а значит допустим событие OnRead в клиенте может выполнится несколько раз... А это значит мне нужно создать например MemoryStream, как глобальную переменную а при выполнении onRead писать всё в MemoryStream последовательно. Я в правильном направлении? Как тогда мне определить начало и конец нового пакета? для того чтобы обработать принятый пакет очистить MemoryStream и начать принимать следующий пакет поток данных нового пакета? Добавлено @ 18:10 С этим я согласен тупанул малёха, теперь делаю так
но тут возникает вопрос чем отличается от того что выше вот это fRSData.WriteBuffer(fData^, SizeOf(fData^)); Добавлено @ 18:15 А что показывать стандартный класс, стандартная функция))) (Delphi XE) Это сообщение отредактировал(а) Antony41 - 13.2.2013, 18:18 |
||||
|
|||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 4 Всего: 41 |
Да. Я уже нашел. Какой протокол? TCP? -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| Antony41 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 27.12.2008 Репутация: нет Всего: 1 |
может вобще стоит перевести ClientSocket в режим блокинга
Добавлено через 6 минут и 52 секунды ну наверно))) ведь TServerSocket/TClientSocket использует его вроде как Добавлено через 11 минут и 54 секунды И еще вот такой вопрос например если у меня клиент будет работать в режиме nonblocking я так понимаю это в основном потоке будут приниматься данные... Предположим что пакет принимался принимался а пользователь затем открыл какое нибудь окно ShowModal, прием данных приостановится? если я размещу на форме компонент TidAntifreeze который собственно не относится к TClientSocket, будет ли пролжаться приём данных в таком случае? |
|||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 4 Всего: 41 |
По размеру передаваемой структуры. Делаешь глобальными (или свойство) буфер (размер твоей структуры) Buff и размер данных записанных в буфер. L В onRead, 0. offset:=0; 1. записываешь в буфер, с позиции L,принятые данные c позиции offset размером count:=min(BuffSize-L,ReadLength-offset) ; 2. L=L+count; 3. If L=BuffSize -> Передаешь записанный буфер на обработку ; L:=0; offset:=offset+count; if offset< ReadLength then goto 1 Это сообщение отредактировал(а) Чучмек - 13.2.2013, 18:39 -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| Antony41 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 27.12.2008 Репутация: нет Всего: 1 |
Жесть что попроще ни как ? может всё таки перевести клиента в режим блокинга и работать уже в потоках?
|
|||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 4 Всего: 41 |
А какая разница?
Неблокирующий: пришел пакет -> событие Блокирующий режим: пришел пакет ->поток вышел из Write. Хоть так хоть эдак, сколько пакетов, столько фрагментов. Добавлено через 3 минуты и 58 секунд
Есть системный буфер. После выхода из Modal прочитаешь несколько пакетов сразу. Это сообщение отредактировал(а) Чучмек - 13.2.2013, 18:51 -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| Antony41 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 27.12.2008 Репутация: нет Всего: 1 |
||||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 4 Всего: 41 |
-------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| Antony41 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 27.12.2008 Репутация: нет Всего: 1 |
ну вот смотрите вот как я сейчас всё переписал приблизительно...
Подопните плиз в нужную сторону если что то не так. Processing(@GlobalData); //там я уже работаю с пакетом SIZE_OF_STRUCT это постоянный размер моей структуры ReadedLen это кол-во прочитанных байт (глобальная Integer) MS это TMemoryStream
Это сообщение отредактировал(а) Antony41 - 13.2.2013, 19:39 |
|||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 4 Всего: 41 |
Antony41, извини сразу не ответил, был занят.
Я с TClientSocket не работал. Работал с сокетами только через API Но чтение я бы сделал так.
Это сообщение отредактировал(а) Чучмек - 14.2.2013, 02:45 -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| Antony41 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 27.12.2008 Репутация: нет Всего: 1 |
впринципе похоже, только вот как быть если данных принято больше чем сама структура. тоесть если пришли данные еще и из слудующего пакета, надо вырезать нужное кол-во байт, а к оставшимся начинать дописывать следующий пакет. Или пакеты не мугут быть склеины? |
|||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 4 Всего: 41 |
Вызовется несколько раз proc. Остаток (меньший, чем размер TData) ,будет хранится в выделенной памяти. Адрес выделенной памяти хранится в связанном с сокетом указателе Data. На каждый сокет свой указатель, своя память. Это гарантирует, что при получении, данные разных соединений не будут смешиваться. -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
![]()
|
| Правила форума "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. |