Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обмен пакетами между сервером и клиентом


Страницы:   1 2

Rembo ©   (2011-02-01 16:58:00) 

Привет всем. Вопрос абстрактного характера.
Реализовываю обмен данными (packed record) между сервером и клиентом на сокетах. Нужно слать много разных данных, иногда строки, иногда записи. Так вот как это лучше сделать чтоб по трафику экономней было? Учитывая что заранее не известно какая именно запись придет (Socket.Receivebuf(buff, buffsize) решил сделать запись с полями на все случаи жизни, некоторые из которых часто будут пустовать. Все ли я правильно делаю?


Сергей М.   (2011-02-02 21:31:00) [21]


> моя запись на все случаи жизни получается и проще и надежней


Кроме одного случая, когда юзер выкинет твой софт в топку или, не дай бог, поколотит тебя за беспардонное и бездумное растранжиривание его, кровного юзерского, трафика, пустьт даже и безлимитного)


> сможет ли сокет принимать пакеты пока работает главный цикл?


Сокет-то сможет).. А вот юзеры, см. выше, выкинут или побьют. если ихние запросы к твоему серверу будут висеть без ответа, пока твой суперцикл мечется по куче запросов)


!   (2011-02-02 18:12:00) [22]


> Сейчас уже думаю что моя запись на все случаи жизни получается
> и проще и надежней...


Логичнее изначально передавать некоторую структуру с информацией о том, какого типа будут переданные данные, какого они размера и какой нить отличительный признак структуры поставить, а при необходимости можно расшить и в этой же структуре передавать контрольную сумму, либо другую информацию для проверки.


typedef struct
{
char strSign[30];  // "@@THE_MY_GAME_STRUCT" - пример признака
int nDataSize;
int nDateType;
}TDataInfo;


Rembo   (2011-02-02 15:28:00) [23]

Сейчас уже думаю что моя запись на все случаи жизни получается и проще и надежней...
Изначально я собирался выделять каждому клиенту место для хранения его запросов (те самые записи), чтобы потом в цикле пробегать по всем клиентам и обрабатывать их запросы (игру делаю), но возник вопрос: сможет ли сокет принимать пакеты пока работает главный цикл? ServerType стоит stNonBlocking, или нужно установить stThreadBlocking и создавать каждому подключению по thread-у?


Anatoly Podgoretsky   (2011-02-02 10:59:00) [24]


> все ж покрошится разве нет

Обязательно покрошится, рано или поздно.


Slym   (2011-02-02 08:37:00) [25]

Rembo   (01.02.11 18:04) [2]
оно по любому покрошится, даже не надейся что все одним куском придет...
оно норовит рассыпаться, а иногда наоборот слипнуться
а ты как программист должен эти крохи собрать в буфер, а если слиплось разделить, благо порядок крошек правильный...


Rembo   (2011-02-01 18:04:00) [26]

Тоесть прям так в TForm1.SocketServer1ClientRead и написать? Допустить что если какие то данные пришли знач сначала обязательно размер идет? А если между получением размера и самих данных будет пауза - все ж покрошится разве нет?


Slym   (2011-02-01 17:02:00) [27]

Rembo   (01.02.11 16:58)
заранее не известно какая именно запись придет

так сделай чтоб было известно - посылай длинну первым делом
Socket.Receivebuf(Size,SizeOf(Size));
Socket.Receivebuf(buff,Size);


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо