Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2002.07.29;
Скачать: [xml.tar.bz2];

Вниз

У меня созрел вопрос про Сокеты.   Найти похожие ветки 

 
Fredericco   (2002-07-02 11:21) [0]

На работе создаем систему, которая состоит из сервера и клиентов (штук так 60). Клиенты, это проги, которые без участия человека общаются с сервером. Работа сервера проста: он принимает заявку, то бишь, идет команда от клиента, выясняет от кого она и кому (у меня там собственный протокол), так же выясняет что это - комманда, ответ на комманду или сообщение об ошибке. Иными словами, сервер обрабатывает завки и проводит их по технологическому каналу. В секунду, максимум, может быть не более 20 заявок. В принципе, все хорошо, только иногда происходят накладки. Например, при непосредственной отправке двух сообщений двум клиентам, иногда отправляется сдвоенное сообщение одному клиенту. Это не очень страшно, но все-таки, тем более, что система разростается и в будущем выйдем на 40-50 заявок в секунду. Вопрос таков, имеет ли смысл переходить на потоковый сервер, то есть каждую заявку запихивать в свой поток, и пусть она ни кому не мешает? И если да, то как это скажеться на производительности?
Заранее благодарен!
Fredercco.


 
Digitman   (2002-07-02 14:59) [1]

Что есть "потоковый сервер" ?
Что есть "каждую заявку запихивать в свой поток" ?


 
Fredericco   (2002-07-02 15:24) [2]

2Digitman © (02.07.02 14:59)
TThread.Create


 
NailS   (2002-07-02 16:19) [3]


> каждую заявку запихивать в свой поток


Это, батенька, извращение будет.
Лучше выдели поток на получение заявки, поток на определитель типа заявки, затем, взависимости от типа заявки, потоки-обработчики конкретного типа заявки и т.д.



 
Digitman   (2002-07-02 16:27) [4]

А какое отношение имеет твоя проблема к однопоточной или мультипоточной обработке запросов ? Я не вижу никакой связи ... Да и не может быть ее ... Если твой сервер допускает такие ошибки, то это - твои ошибки как разработчика серверной логики, а в каком потоке они будут происходить или не происходить - неважно ... Доп.код.потоки нужны для организации параллельных вычислений и не более того.


 
Malder   (2002-07-02 17:40) [5]

В принципе, все хорошо, только иногда происходят накладки. Например, при непосредственной отправке двух сообщений двум клиентам, иногда отправляется сдвоенное сообщение одному клиенту.
то есть, посылаешь одно сообщение одному IP, второе сообщение другому IP, а приходит сдвоенное сообщение одному из этих IP ?
Эт ововсе не "все хорошо"


 
Wizard_Ex   (2002-07-02 18:15) [6]

Длину указывай в сообщении и проверяй ее везде

а на сервере обрабатывай сообщение тоже с учетом длины принятого
и если два сообщения в один слились то обрабатывай куски по длинам
. Допустим
##Length##Твое_сообщение##Length##Чье-то_сообщение

берешь длину и обрабатываешь кусок сообщения этой длины после оператора длины (если можно так выразиться), оставшийся кусок проверяем не равен ли он ничему, если не пустой обрабатываем также, то есть имеет место цикл, что бы сервер не глотал сообщения

что то вроде этого наверно


 
Wizard_Ex   (2002-07-02 18:26) [7]

Потому как проблема не в том, что

// иногда отправляется сдвоенное сообщение одному клиенту.

а в том что сервер одновременно принимает сообщения от нескольких клиентов, которые для него один кусок данных, которые он уже и отправляет первому(адресованное сообщение кому дошло первым до сервера),а сообщение второму клиенту идет уже прицепом, но сервер повторюсь видит это как один кусок данных потому что принял их практически одновременно,

в сдвоенном сообщении которое приходит первому клиенту наверно видно второе с командами вашего протокола ;-)
принципиально похоже на расширенный чат

а потоками будет все также, пока логику не исправишь


 
NailS   (2002-07-03 11:16) [8]

Вообще-то, как мне показалось, вопрос то был про архитектуру приложения ;).
Так, может интересно почитать будет
www.softcraft.ru


 
Fredericco   (2002-07-03 12:18) [9]

2Malder © (02.07.02 17:40)
У меня все клиенты на одной машине, => у них у всех один IP. Эти клиенты - драйверы оборудования. Если приходит сдвоенное сообщение одному клиенту, то он свое поймет и выполнит, как надо, просто второй клиент своего не получит.
2Wizard_Ex © (02.07.02 18:26)
Как раз это и происходит. А иногда и из-за другого. К примеру, есть два устроиства. Пришло от них 2 команды к серверу. Сервер прочел первую и
Unit1.MyProcedure1;
потом вторую и
Unit2.MyProcedure2;.
Все нормально. Есть моя процедура, общая для всех.

SendTextToHandle(Handle:integer;const Text:string);
begin
....
ServerSocket.Socket.Connections[i].SendText(Text);
....
end;

В конце моих процедур 1 и 2 результат их выполнения есть отправка какой-нибудь команды процедурой SendTextToHandle. Вот, и иногда клиенту приходит сообщение второго. Это не страшно, на работу системы в целом не сказывается, но наличие такого факта настораживает. Причем, проверял: принимаются сообщения отдельно.


 
Digitman   (2002-07-03 13:09) [10]

>Fredericco


> У меня все клиенты на одной машине, => у них у всех один
> IP
..

И что ? Провайдер выделил твоему узлу некий единственный IP-адрес, имея его ты преспокойно запускаешь косой десяток экземпляров IE, аськиных клиентов дюжину , почтовых клиентов несколько ... да мало ли еще каких инет-приложений одновременно работают на твоей машине ! И работают - заметь - совершенно независимо друг-от-друга ... не трогая "чужие" пакетные данные ... и при этом - всего один IP-адрес для связи с провайдером ! И тебя это не удивляет как бы ... Зато вот сильно удивляешься, когда твои собственные кл.приложения делают как бы примерно тоже самое, но почему-то неправильно ....
Вывод простейший напрашивается ...


 
Fredericco   (2002-07-03 14:31) [11]

Digitman © (03.07.02 13:09)
Не обижайся, конечно, но вывод один напрашивается. Что тебе влом подсказывать, а охота лишь знаниями покозырять. Я понимаю, что ты в порядке и мне до твоего интелекта еще год по навозу плыть, но на фига ты тогда постишся, если советов дельных давать не хочешь? То что ты процетировал - это ответ на вопрос
> то есть, посылаешь одно сообщение одному IP, второе сообщение
> другому IP, а приходит сдвоенное сообщение одному из этих
> IP ?

см. выше, что Malder © (02.07.02 17:40).
Знаешь чем отличается проффесионал от делитанта? Стабильностью. Проффесионал даже в самой простой ситуации, не расслабится, а наоборот еще больше сосредоточится и примет правильное решение. Пусть ты там у себя Бог сокетов, но кто ты на самом деле, если на такой простой вопрос (может даже глупый) ответа ясного дать не можешь?



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2002.07.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.007 c
6-95468
SemFLY
2002-05-16 23:32
2002.07.29
FTP Server


3-95230
grig
2002-07-08 15:51
2002.07.29
Узнать будущее значение AutoInc поля


1-95412
c0pYc@t
2002-07-16 11:07
2002.07.29
Закрытие программы


1-95382
Fissher
2002-07-15 20:09
2002.07.29
Снова я со своим ComboBox-ом !!!


7-95588
kmc
2002-05-11 09:16
2002.07.29
Как закрыть очередь на спуле?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский