Форум: "Сети";
Текущий архив: 2002.09.26;
Скачать: [xml.tar.bz2];
ВнизClientSocket, ServerSocket - несколько отправок Найти похожие ветки
← →
cyborg (2002-07-22 14:53) [40]Какой один, какой другой клиент?
В один сокет приходит, в одном и разделяется всё. И все сообщения получаются, а не только первое. Этот код хоть 100 склееных сообщений разделит.
← →
cyborg (2002-07-22 14:55) [41]panov © про разделители в строке мы тут обсуждали уже, работать будет, но всё таки .... короче обсуждали уже :)
← →
Fredericco (2002-07-22 16:39) [42]2cyborg ©
У тебя только один клиент?
У меня нет. И важно что бы каждый получил таки свое сообщение.
А на счет разделителя в строке, мой собственный протокол построен так, что клиент только свое и заберет.
У меня структура системы такая, чот один клиент посылает серверу комманду: пошли клиенту такому-то такое-то сообщение. И если в тоже мнгновение получится: пошли клиенту другому-то такое-то сообщение. То сообщение придет первому и сдвоенное. Вот почему я использую алгоритм описанный мной выше.
> ИМХО для разных задач разный способ.
← →
Fredericco (2002-07-22 16:51) [43]Так. Я не прав. Думал только о клиентах. То что я придумал - можно проще, так как вы советуете. Сорри, что спорил.
Встает вопрос.
Скажем есть на сервере единая процедура обработки сообщения пришедшего от клиентов.
procedure TextReceiveFromClient(const Text:string);
Вот сервер получил сдвоенное сообщение, разделил его на два, как дальше поступить? Ведь нужно сначал вызвать процедуру с первым сообщением, а потом со вторым? Как быть?
← →
cyborg (2002-07-22 17:08) [44]Делается так:
Procedure ProcessData( передаваемые данные; var Socket : TWinSocket);
Begin
//обрабатываем данные если нужно посылаем Socket что требуется
End;
дальше из моего примера
repeat
Move(StringReceive[1],ReceiveCheck,4);
Move(StringReceive[5],DataSize,4);
if ReceiveCheck=Check then //Если признак начала правильный
if DataSize+8<=Length StringReceive then
begin //Если сообщение не обрезанное
SetLength(StringMessage,DataSize);
Move(StringReceive[9],StringMessage[1],DataSize);
Delete(StringReceive,1,DataSize+8);
ProcessData( StringMessage, Socket);
end
else Quit:=True
else Quit:=True;
until quit;
← →
Brand (2002-07-22 17:35) [45]А вот и я, автор.
Блин, я уже давно все сделал и забыл про эту тему. А вот зашел, шляжу, а тут такое..................
Граждане, спокойствие, только спокойствие.
← →
Fredericco (2002-07-22 19:09) [46]cyborg ©
Может я ошибаюсь и сейчас (конец рабочего дня - простительно), но на стороне сервера ИМХО, прием данных делать как ты сказал, а отправку по моему способу. Тогда и клиентское сообщение не потеряется на сервере (твой способ) и каждому клиенту дойдет его сообщение (мой способ).
Ежели что не так, критекуй!
← →
cyborg (2002-07-22 20:03) [47]С этим кодом работает как сервер так и клиент, сокет то в принцпе такой же, только сервер ждёт когда к нему подключатся, а клиент подключается, у меня чат работает по такому принципу, что сервер, что клиенты, каждая мессага идёт в свою трубу, никакие сокеты между собой по идее не смешиваются, когда сервер посылает одному клиенту, это сообщение никак не может придти в непредназначенный сокет. Если бы так было, как ты говоришь, то при отправке из сервера мессаг всем клиентам, то все вместе мессаги приходили бы только первому попавшемуся клиенту?
Я понимаю так, что при подключении клиента к серверу сервер создает новый сокет и никак данные из одного сокета не могут попасть в другой сокет, если только сам сервер не посылает им данные.
Лучше конечно сделать с sendbuf но в строке удобно то, что можно легко обратиться к определённому байту string[x] поэтому я так сделал, в принципе sendbuf и sendtext одно и тоже, sendtext использует тот же SendBuf, сам в исходниках посмотри. Ctrl держи и мышкой на функции нажимай, если у тебя пути прописаны к библиотекам модулей, то перескочишь на исходный текст той функции.
← →
Fredericco (2002-07-23 10:38) [48]2cyborg ©
Ты прав. У меня просто не совсем стандартное пременнение сокетов, и структура сети, моей, тоже спецефичная, поэтому такие идеи и рождались.
← →
Alibaba (2002-07-25 11:09) [49]> Brand
Ты ж акуратненько с такими вопросами... :)
← →
Alex SV (2002-07-25 11:11) [50]> Brand
Так расскажи нам как ты реализовал отправку?
← →
Володя Шарапов (2002-07-25 11:15) [51]Я тут почитал как предлагают организовать пересылку.
Попробовал с использованием разделительных символов - у меня получилось.
Страницы: 1 2 вся ветка
Форум: "Сети";
Текущий архив: 2002.09.26;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.007 c