Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2010, 15:10   #1
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию Эффективное решение проблемы склеивания пакетов.

Всем доброго.
Есть такая проблема как склеивание пакетов при передаче по сокетам, т.е. если я выполняю подряд операции
Код:
ClientSocket1.Socket.SendText(m);
ClientSocket1.Socket.SendText(m);
То эти две строки которые я передаю склеются в одну.
А мне нужно следующее:
Каждая ClientSocket1.Socket.SendText должна либо ждать пока сервер ее полностью обработает, можно даже с застопорением программы, пока ответ не придет, либо сам сервер должен распознавать что пришли две разных команды-строки, и уже либо их обрабатывать по порядку, либо на каждую заводить отдельный поток.

Вопрос: Какими средствами, компонентами это проще всего реализовать? Я сейчас остановился на стандартных TServerSocket;
TClientSocket;
Можно ли их как-то настроить делать такие вещи?

Заранее спасибо. Если будет ссылки на литературу, примеры, описания буду только рад.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.02.2010, 16:49   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

ну склеится и бог с ним, пусть сидят в буфере пока не отправятся... пусть сервер разбором занимается, например добавлять #13
Код:
ClientSocket1.Socket.SendText(m + #13);
ClientSocket1.Socket.SendText(m + #13);
а ожидание лишняя головная боль.


upd
-------

Цитата:
Эх... Ну так вот не хотелось по этой тропинке идти...
тут узкое место либо при передаче, либо буфер c накоплением на приеме... как-бы от задачи зависит, если нужно клиенту четко знать, что команда не просто дошла, но и выполнилась на сервере, тогда и обратную связь-бы нужно.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 02.02.2010 в 17:16.
raxp вне форума Ответить с цитированием
Старый 02.02.2010, 17:02   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
пусть сервер разбором занимается
Эх... Ну так вот не хотелось по этой тропинке идти...
Не верю чтоб борландовцы не придумали решения этой мелкой проблемы.
по крайней мере в IdHTTPServer она решена...
Но что-то не очень хочется Инди пользовать, я пока не очень понял как с ними работать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.09.2011, 17:21   #4
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Скажите пожалуйсто, вот у меня проблема с склеиваниями пакетов, я бы может и добавил бы на сервер "разборщик пакетов", но просто у меня сами клиентские-сокеты сохраняется в переменную-массив. Вот пример:

Программа-сервер Событие OnConnect:
Код:
procedure TAntiCheatGTA.ServerSClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
NewUser := TUser.Create;
ActiveConnections:=ActiveConnections+1;
NewUser.Number := ActiveConnections;
NewUser.Socket := Pointer(Socket);
Socket.Data := NewUser;
PlayersCount.Text:=inttostr(ActiveConnections);
end;
Программа-сервер Событие OnRead:
Код:
SetLength(s, Socket.ReceiveLength);
SetLength(s, Socket.ReceiveBuf(Pointer(s)^, Length(s)));
sss:=MyCodeEncode(s,1);
len:=Length(sss);
TUser(Socket.Data).SuperInf:=sss;
TUser(Socket.Data).Name:=Copy(sss,1,Pos('|',sss)-1);
TUser(Socket.Data).Cheater:=Copy(sss,Pos('|',sss)+1,len-1);
TUser(Socket.Data).Version:=Copy(sss,len-4,len);
len:=Length(TUser(Socket.Data).Cheater);
Delete(TUser(Socket.Data).Cheater,len-4,len);
len:=Length(TUser(Socket.Data).Version);
Delete(TUser(Socket.Data).Version,1,len-4);
len:=Length(TUser(Socket.Data).Version);
Delete(TUser(Socket.Data).Version,len,len);
Получается, что когда пользователь коннектится для него создается отдельная переменная и туда сохраняется сам сокет( но суть не в этом), после чего клиент отсылает пакет данных, которые сервер читает и заносит в TUser. Так вот если 2 или больше клиента пошлют такой пакет, то информация склеивается. Если я буду разберать принятый склееный пакет, то будут утеряны Socket.Data.
Каждый день узнаю новое...
Anton911 вне форума Ответить с цитированием
Старый 11.09.2011, 17:28   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а именно и придется разбирать согласно вашему протоколу.
ибо TCP считается потоковым протоколом.
Цитата:
Так вот если 2 или больше клиента пошлют такой пакет, то информация склеивается.
это ж как вы читаете так что у вас склеиваются данные от разных клиентов?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.09.2011, 17:36   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Если что я не помошник. Я на НТТР пересел, и проблем с многопользовательской схемой не получаю.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Генератор пакетов Mr_Romik Работа с сетью в Delphi 3 30.10.2009 23:56
Подскажите, плиз, решение проблемы с компиляцией в Dev-Cpp Confidential Общие вопросы C/C++ 2 20.10.2009 14:06
"Windows заблокирован" - решение проблемы! Web-Gangsta Windows 20 25.05.2009 03:49
Фильтр пакетов Stolen Общие вопросы Delphi 0 07.02.2009 09:38
по заданному А найти эффективное решение Chidory Помощь студентам 1 14.09.2008 17:24