Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
14-85645
AL2002
2002-08-30 12:34
2002.09.26
Нужна козырная свинья-копилка


3-85372
Sergeyy
2002-09-04 09:58
2002.09.26
DefaultExpression в поле ADODataSet


1-85557
deleon
2002-09-12 08:29
2002.09.26
Как получить контрольную сумму (CRC) функции?


8-85612
PSYS
2002-05-27 01:38
2002.09.26
коорд. обьектов на рис.(Polygon) как в выводить надпись над ними


1-85469
sizmrebi
2002-09-16 12:43
2002.09.26
Effects:=strikeout





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский