-
-
Внимание! Здесь обсуждаются вопросы, связанные с разработкой компонентов, редакторов свойств, редакторов компонентов и экспертов IDE.
Вопросы по поиску и использованию готовых компонентов, редакторов или экспертов являются нарушением тематики и могут быть удалены.
-
Зависит от версии Инди
-
Извиняюсь перед админами.
Сергей, версия 10
-
и что бы узнать его адрес там и тд?
Адрес и тд узнавать не надо. Он уже есть в сессии подключенного клиента
-
> Zalm
У любого наследника TIdCustomTCPServer, каковым является и TIdCmdTCPServer, есть публичное св-во Contexts, представляющее собой потокозащищенный список потоков, в контекстах каждого из которых исполняется каждое из активных соединений с клиентами.
Каждый из элементов этого списка есть объект класса TIdPeerThread, у которого есть объектное св-во Connection, со всеми вытекающими)
-
как раз таки я не заметил что бы из COnnection что-то вытикало, я его видел, но ничего конкретного из него мне получить неудалось
-
чтобы вытекание было заметным надо после коннекшена поставить точку и подождать подсказки иде
-
Да уж, слона-то ты и не приметил)
А справка, надо понимать, тоже молчит ?
-
"Server.Contexts" вот тут ниче нет явно
"Server.Bindings.Items[0].Handle" вот так можно что-то добиться, но тут УЖЕ надо знать индекс подключения, да и адрес не узнать....
а справки у меня нету)
-
мало точек поставил
-
да и адрес не узнать....
Интересно, что ты будешь делать, если узнаешь этот адрес.
-
> "Server.Contexts" вот тут ниче нет явно
Что значит "нече нет явно" ?
> Server.Bindings
Это из другой оперы, к клиентским коннектам оно отношения не имеет.
> справки у меня нету
Мыши сгрызли ?)
Коли нету - купи, найди, укради.
Без справки ничего путного не получится - так и будешь тыкаться как слепой котенок)
-
> Сергей М. (31.08.2009 16:43:12) [12]
А не умрет ли он скорее со справкой, ведь речь про ИНДИ
-
> Anatoly Podgoretsky © (31.08.09 16:56) [13]
Ну дык еще и исходники всегда перед носом)
Довольно сложно сыграть в ящик, имея справку+исходники ..
-
примеры у меня ткоа на 9-ю версию есть, там иначе всё написано.
-
Скачай для 10-ки, в чем проблема ?
Заодно и справку скачай.
-
и все же загадка. зачем ему понадобился адрес клиента.
-
да адрес клиента не при чем, это я просто сказал что например как узнать.
Главное как клиента идентифицировать что бы потом знать кто есть кто...
-
коннекшен - это и есть "кто"
-
угу, если бы я писал через TServerSocket я бы не задавал таких тупых вопросов.
Ну вот разве что это что-то дельное AContext.Connection.Socket.Binding.Handle;
и адрес там можно узнать.
Тока пользы никакой для меня, в Server.Contexts я так и не нашел куда можно этот значение приспособить...
Тока в Server.Bindings.BindingByHandle(HND).SendTo(); можно пихнуть... и то не получилось:(
а примеры на 10-Ю версию не могу найти((
-
Дядя, в метод OnExecute сервера тебе передано нечто.
Нечто это бывает разным в разных версиях инди.
Вот это нечто и есть то что тебе надо. А так же все что вложено в этот тип.
-
для десятки это будет так:
IdCmdTCPServer1Execute(AContext: TIdContext);
вот этот контекст и есть то, что чего ты весь день ищешь
-
а мне Execute не надо, я там ничего не пишу, всё только в командным обработчиках. А через OnConnect просто хотел записывать данные в массив о подключившихся что бы их как-то различать потом.
только вот как записать в массив что-то конкретное из события OnConnect я так и енп онял... Не подскажете?
-
> мне Execute не надо, я там ничего не пишу
А куда ты денешься с подводной лодки ?
Придется писать.
> как записать в массив что-то конкретное из
Не надо ничего никуда "пихать" - все уже давным-давно "напихано".
В списке Connections.LockList каждый элемент - это TIdPeerThread.
У TIdPeerThread есть объектное св-во Connection: TIdSocketHandle
У объекта TIdSocketHandle есть св-ва PeerIP и PeerPort - адрес и порт клиента. Эта комбинация всегда уникальна, и этого достаточно для однозначной идентификации клиента.
Кр.того, у объекта TIdSocketHandle есть send/recv-методы для коммуникации с клиентом.
-
эх так и знал что вся подстава в этом LockList ((( я его открыл посмотрел и забил, ибо не показалось что как-то с сервером связано.
А зачем обязательно в Execute писать?
Спасибо большое, щас пойду пробовать.
-
Я наверное что-то не понимаю... но у меня нельзя так сделать из любого места. Вот допустим я знаю порт и адрес, как вы сказали,
Потом отсылаю в процедуру, адрес и порт, а когда хочу написать в процедуре Server.Connections то такого нет, есть только Server.Contexts.LockList а в лок-листе нет опять же свойства ни сокетов ни Connections... опять я чего-то не понял? :(
-
ты сначала вот над этим порассуждай:
присоединился клиент и висит на сервер. затем он отправляет на сервер команду.
серверу в это время приходит в голову разослать всем клиентам сообщение и он это делает.
а клиент в это время команду уже отправил и ждет свой законный ответ именно на нее.
вместо этого он получает кусок байтов, которые он интерпретирует как ответ на команду.
а на самом деле там у тебя там дрова лежат.
ps
для обмена между сервером и клиентом нужно стрго следовать какому-то стандартному протоколу, либо придумать свой протокол и следовать ему.
-
> зачем обязательно в Execute писать?
А ты и в Execute не напишешь.
Execute вызывается только если у сервера список CommandHandlers пуст, а он у тебя заведомо не пуст, ибо нафих тогда нужен TidCmdTCPServer ?
Ты пойми главное - TidCmdTCPServer не предназначен для выкрутасов задуманного тобой вида, он заточен и призван работать в режиме "команда клиента -> ответ сервера как результат выполнения этой команды". На то как раз ComandHandler'ы у него и существуют.
-
А какие у меня выкрутасы?) вобще задача у меня такая, нужен сервер который будет как бы точкой переброса, короче надо что бы он мог создавать "пары" из соединений, и транслировать между ними (между членами в паре) трафик, в данном случае любой текст, который любой член этой пары захочет послать. Например один клиент передает команду на сервер, сервер принимает и смотрит от кого пришло и пересылает это тому кто находится в паре с этим клиентом. Да, такая спицифическая система)
Тогда что вы бы посоветовали какой компонент использовать?
Подскажите пожалуйста как лучше можно было бы сделать.
-
> как лучше можно было бы сделать
Пока не будет внятного разработанного тобой протокола информационного обмена, рассуждения на тему "лучше-хуже" лишены смысла.
-
эх.. а конкретнее?
что сложного сделать сервер котоый будет просто текст перебрасывать?
ему же ничего не надо трогать, получил, передал дальше, и всё.
Как я понял уже через TIdCmdTCPServer это не очень удобно делать.
-
> что сложного сделать сервер котоый будет просто текст перебрасывать?
А нашиша тогда выбрал TIdCmdTCPServer, если требуется "просто текст перебрасывать" ? Почекму не TIdTCPServer ? И чем так уж не угодил тот же самый TServerSocket, тем более что там для тебя "проще всё, ну или понятней" ?
> а конкретнее?
Вот сейчас мы с тобой "разговариваем" при использовании протокола информационного обмена HTTP.
А ты разработал свой протокол ?)
-
Я знаю что такое HTTP и как работает...
Если это можно назвать "разработал", то можно и так, но только не для обмена с сервером "пересылки", а с конечными точками.
TServerSocket мне не нравится так придется все потоки в ручную писать и много вобще придется писать.
А на TIdTCPServer думаю проще будет, он и потоки сам создает же, и всё лучше... так что попробую через него.
Еще вопрос такой мб сторонний немного, к этой теме относится только тем что тоже работа с сетью. Можно Как-то закосить сервер под сервер аси? что бы например конектится не к login.icq.com, а например к моему сервру, и что бы он клиенту контакт лист выдал и мог читать что этот клиент отправит на сервер? и не более. Больше ничего серверу не требуется кроме как выдать конаткт лист с заранее вписанными на сервер контактами, и читать что этим контактам будет слать клиент. То есть есть один сервер и один клиент.. ну думаю вы поняли задачу..)
-
> но только не для обмена с сервером "пересылки", а с конечными
> точками
А "конечные точки" у тебя между собой напрямую не взаимодействуют.
Они же у тебя "разговаривают" через твой сервер-посредник, так что и речь может идти не иначе как о протоколе инф.обмена между клиентами и сервером-посредником.
> TServerSocket мне не нравится так придется все потоки в
> ручную писать
В смысле ?
> Можно Как-то закосить сервер под сервер аси?
Можно.
-
что сложного сделать сервер котоый будет просто текст перебрасывать?
не сложно. сложно написать клиента который понял бы все перебрасываемое ему.
хотя тоже не сложно (если самому себе не рыть ям)
-
я знаю как всё написать, просто пока не определился точно к компонентом.
Читая протокол я не понял какие команды сначала надо слать с сервера клиенту когда он подключится тока... я подключался с телефона к серверу, он подключается и молчит и чего-то ждет... где можно прочитать коротко какая последовательность компанд друг другу дожна быть что бы они подключились? Подскажете?
-
> Читая протокол
Как можно читать то, что ты еще не написал ?)
> какие команды сначала надо слать с сервера клиенту
А что, клиент нуждается в каких-то командах ?
Нахрена, спрашивается, тогда нужен сервер, если клиенты готовы исполнять его прихоти ?)
> какая последовательность компанд друг другу дожна быть что
> бы они подключились?
Никакая.
Ты же сам утверждаешь, что якобы "подключался с телефона к серверу", при этом ни ты серверу, ни сервер тебе не посылал никаких "команд")
Чудеса ?)
-
> Ну дык еще и исходники всегда перед носом)
Ну ты и садист.
-
ох... вернулся к этой тему.. что-то я никак не пойму:( у меня не получается никак отправить кому-то что-то за пределы его потока.
можете пожалуйста если вам не сложно показать кусок конкретного кода как отправить кому-то что-то не из его потока?
Я был бы очень благодарен
-
отправить через TidTCPServer, забыл уточнить
-
> у меня не получается
Показывай что делал ..
С подробными комментариями движений своей мысли для каждой строчки своего кода ..
-
> отправить через TidTCPServer, забыл уточнить
Хоть через луну !
Ход своей мысли продемонстрируй ..
-
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdCustomTCPServer, IdTCPServer, Buttons,
idContext;
type
TForm1 = class(TForm)
Server: TIdTCPServer;
procedure ServerConnect(AContext: TIdContext);
procedure ServerExecute(AContext: TIdContext);
private
public
end;
_Pack = Record
Primary_handle : Cardinal;
Secondary_handle : Cardinal;
Primary_index : string[8];
Secondary_index : string[8];
End;
Function Connect_to_Clients( Handle : cardinal; index : string):boolean;
Function GetHandleByHandle(Handle : cardinal):Cardinal;
Procedure Transfer(handle : cardinal; str: string);
var
Form1: TForm1;
Pack : _Pack;
Clients : Array of _Pack;
Clients_count : integer;
implementation
procedure TForm1.ServerConnect(AContext: TIdContext);
var
str : string;
begin
AContext.Connection.Socket.WriteLn('Welcame'+#13+'Index[8]: ');
Str:=AContext.Connection.Socket.ReadLn();
if length(str)<>8 then
begin
AContext.Connection.Socket.WriteLn('Error length index');
AContext.Connection.Disconnect;
end
else
begin
if Connect_to_clients(Acontext.Connection.Socket.Binding.Handle,str) then
begin
Acontext.Connection.Socket.WriteLn('Start transfer');
end
else
begin
Acontext.Connection.Socket.WriteLn('Error registration');
AContext.Connection.Disconnect;
end;
end;
end;
Function Connect_to_Clients( Handle : cardinal; index : string):boolean;
var
i : integer;
register_ : boolean;
begin
Result:=false;
for i:=0 to Clients_count-1 do
begin
if ((Clients[i].Primary_index=index)or(Clients[i].Secondary_index=index)) then
begin
if Clients[i].Primary_index=index then
begin
Clients[i].Secondary_handle:=Handle;
Clients[i].Secondary_index:=index;
result:=true;
exit;
end;
if Clients[i].Secondary_index=index then
begin
Clients[i].Primary_handle:=Handle;
Clients[i].Primary_index:=index;
result:=True;
exit;
end;
end;
end;
inc(clients_count);
SetLEngth(Clients,Clients_count);
Clients[Clients_count-1].Primary_handle:=handle;
Clients[Clients_count-1].Primary_index:=Index;
Result:=True;
end;
procedure TForm1.ServerExecute(AContext: TIdContext);
var
msg : string;
i : integer;
begin
msg:=AContext.Connection.Socket.ReadLn();
if msg='\handle\' then
begin
AContext.Connection.Socket.WriteLn(IntTOStr(AContext.Connection.Socket.Binding.H andle));
exit;
end;
if msg='\clients\' then
begin
for i:=0 to CLients_count-1 do
begin
AContext.Connection.Socket.WriteLn(
'-----------------'+#13+'Couple '+IntToStr(i+1)+#13+
'PH: '+IntToStr(Clients[i].Primary_handle)+#13+
'PI: '+Clients[i].Primary_index+#13+
'SH: '+IntToStr(Clients[i].Secondary_handle)+#13+
'SI: '+Clients[i].Secondary_index);
end;
AContext.Connection.Socket.WriteLn('Done. '+IntToStr(Clients_count)+' couples.');
exit;
end;
if msg='\couples\' then
begin
AContext.Connection.Socket.WriteLn(INtToStr(Clients_count)+' couples.');
exit;
end;
if msg='\GetHandleByHandle\' then
begin
AContext.Connection.Socket.WriteLn(IntToStr(GetHandleByHandle(AContext.Connectio n.Socket.Binding.Handle)));
end;
Transfer(AContext.Connection.Socket.Binding.Handle,msg);
end;
Procedure Transfer(handle : cardinal; str: string);
var
_handle : cardinal;
begin
_handle:=GetHandleByHandle(handle);
end;
Function GetHandleByHandle(Handle : cardinal):Cardinal;
var
i : integer;
begin
result:=0;
for i:=0 to Clients_count-1 do
begin
if Clients[i].Primary_handle=handle then
begin
result:=Clients[i].Secondary_handle;
exit;
end;
if Clients[i].Secondary_handle=handle then
begin
Result:=Clients[i].Primary_handle;
exit;
end;
end;
end;
end.
вот, вроде как бы всё работает, но до определенного затыка в процедуре Transfer.
-
Тихий ужас..
Хендлы какие-то куда-то отправляются ..
Ты в состоянии изложить формальное описание разработанного тобой протокола инф.обмена между клиентами и сервером ?
-
За каким тебе понадобились хендлы, если у тебя есть список уникальных объектов IdTCP.Server.Connections, каждый из которых отражает контекст соединения сервера с одним из его активных клиентов ?
-
да что есть? ничего там нет, просил же показать то о чем вы всё время говорите, так вы не можете.
Зачем вам всё время нужен этот протокол я никак не понимаю, у меня проблема совсем в другом.
-
> если у тебя есть список уникальных объектов IdTCP.Server.
> Connections
У вас может быть и есть, а у меня нету. есть только Server.Contexts в котором есть LockList в котором уже я ничего не нашел.
Вот просил же хоть что-то показать конкретное, а вы мне только наводящие вопросы задаете, которые ни на что не наводят меня(
-
> Зачем вам всё время нужен этот протокол я никак не понимаю
Для того чтобы понять "язык", на котором ты пытаешься заствить разговаривать своих клиентов со своим сервером - что, кому, когда, в каком формате и при каких условиях передается/принимается
Пойми, наконец, что без формализованного прикладного протокола инф.обмена ничего путного у тебя не получится. Любую сколь-либо серьезную сетевую разработку следует начинать с листа бумаги и авторучки, а не со слепого тыканья в компонентах.
> у меня проблема совсем в другом
Не надо себе их, проблемы эти, создавать, тогда и не придется их потом героически преодолевать.
Взять хотя бы элементарное, о чем я у тебя уже спросил в [45] ..
-
> у меня нету. есть только Server.Contexts
Да ну какая разница ?
пусть будет не Connections, а Contexts - суть свойства от этого не меняется.
> LockList в котором уже я ничего не нашел
Что и где ты искал из того что не нашел ?
-
> вопросы задаете, которые ни на что не наводят меня
Это печально. Очень.
-
> Zalm (07.09.2009 12:57:47) [47]
Так вопросы задаются, потому что от тебя не поступило полной информации,
если не ты, то мы.
-
> Zalm
Ты вообще осознаешь, что работу с каждым из своих клиентов IdTCP-сервер осуществляет в отдельном дополнительном треде ?
Судя по
> У TServerSocket было проще всё, ну или понятней
ты обязан это осознавать, ибо в режиме stThreadBlocking TServerSocket работает точно так же как и IdTCP-сервер.
Если осознаешь, то почему не выполняешь обязательную синхронизацию доступа к потоконебезопасным ресурсам, таким как, например, массив Clients, переменную Clients_count ?
-
Ну нету никакого протокола. В коде же видна идея как осуществляется обмен. При подключении "зарегистрировали" клиента, и всё, потом другой клиент подключается, такая же процедура, если они вводят один и тот же индекс, они получаются в паре, и сервер сразу передает между ними абсолютно всё что шлют (текст). Клиенты к этому серверу-посреднику обратиться никак не могут, ибо незачем.
> За каким тебе понадобились хендлы, если у тебя есть список
> уникальных объектов IdTCP.Server.Connections, каждый из
> которых отражает контекст соединения сервера с одним из
> его активных клиентов ?
а как записывать какие-то данные о клиенте что бы потом знать кто с кем в паре? Записать хендл мне показалось более целесообразно так как я видел функцию BindingByHandle, я подумал что можно по обработчику пробиться до сокета который он обрабатывает. Но идея завалилась.
А толку записать порт и адрес как вы говорили? что мне потом с ними делать?
> > LockList в котором уже я ничего не нашелЧто и где ты искал
> из того что не нашел ?
Ну вот Server.Contexts.LockList а дальше что? есть Items[index:integer]:pointer, это единственное что вызывает какое-то внимание, но сделать тоже ничего не получается с этим. Так что чем может помочь этот LockList я не понимаю, и вы подсказать не можете.
видел кусок из примера для инди 9
List := tcpServer.Threads.LockList;
try
for Count := 0 to List.Count -1 do
try
TIdPeerThread(List.Items[Count]).Connection.WriteLn(Msg);
except
TIdPeerThread(List.Items[Count]).Stop;
end;
finally
tcpServer.Threads.UnlockList;
end;
Они себе в переменную типа TList копируют себе этот LockList и рассылают всем сообщение. ТОлько что такое TIdPeerThread я не знаю, у меня такого нет. У них есть еще IdThreadMgrDefault1: TIdThreadMgrDefault; это в описании, тоже не знаю что это, у меня ткого нет.
Вобщем жаль что не хотите ничего конкретного подсказать.
-
> Ты вообще осознаешь, что работу с каждым из своих клиентов
> IdTCP-сервер осуществляет в отдельном дополнительном треде
> ?
это да, это я знаю.
> почему не выполняешь обязательную синхронизацию доступа
> к потоконебезопасным ресурсам, таким как, например, массив
> Clients, переменную Clients_count ?
не знаю, я такого раньше не делал, проблем как мне казалось из-за этого не было. да и как это синхронизацию я не знаю, я с этим не сталкивался к сожалению
-
Ну нету никакого протокола.
У тебя ничего не получится.
-
> Ну нету никакого протокола
Ты прикидываешься или где ?
Как это "нету" ?
А это, к примеру, что по-твоему
> 'Welcame'
?
Почему именно "велцаме" у тебя фигурирует, а не "Здарофф, чувак ! Ет я, сервер, с тобой разговариваю" ?
-
> Ну вот Server.Contexts.LockList а дальше что?
Ну и что толку тебе объяснять про "дальше что", если межпоточная синхронизация и защита ресурсов для тебя что новые ворота ?
-
> что такое TIdPeerThread я не знаю, у меня такого нет
В 10-ке элементами этого списка явл-ся объекты класса TIdContext
-
про ресурсы ему еще рано.
он кажется самого главного не понял:
если хочется, чтобы сервер имел возможность отправки сообщения в произвольный момент времени, то клиент такого сервера должен постоянно висеть в процедуре чтения буфера и ни на что иное не отвлекаться.
При этом он теряет возможность отправлять на сервер что-либо по своей инициативе.
Причем на все время своей сессии.
-
> про ресурсы ему еще рано
Тогда и делать ему пока нефига в индейских серверах. Не по сеньке шапка.
Есть TServerSocket, есть stNonBlocking - там ему "было проще всё, ну или понятней".
Какого лешего ему понадобилось лезть в индейские мультипоточные блокирующие дебри - до сих пор не понятно.
Было бы хотя бы вразумительное обоснование выбора Инди - был бы тогда и стимул вдалбливать ему про синхронизацию и прочую мультипоточную требуху. А так - что о стенку горох)
-
правильная конфигурация:
сервер постоянно читает запросы клиентов.
получив запрос клиента, отправляет ему ответ, затем снова читает/ждет следующий запрос.
рассылка всем клиентам сообщения по инициативе сервера:
сервер получает текст сообщения от администратора и ничего никуда не посылает. Запоминает его и ждет, когда клиент запросит " А нет ли для меня какого-нить сообчения?"
Получив подобный запрос клиента, сервер отдаети ему сообщение прямо в обработчике команд, без всяких локлистов и прочей ерунды.
-
> без всяких локлистов и прочей ерунды
В мультипоточном сервере без lock-тряхомудии вряд ли обойтись)
Другой вопрос - она нада ли автору, мультипоточность та самая ..
Впрочем, он и сам не знает.
-
локлист нужен для операций по инициативе сервера.
допустим что клиент у нас "событийный", а сервер "процедурный".
то есть все построено задом наперед.
тогда да.
лочим список коннектов, засылаем клиентам мессаджи и разлочиваем.
если же сервер посторить как строят его нормальные герои (ожидание запроса->обработка->посылка ответа ), то лочить ничего не надо.
все происходит либю в OnExecute, либо в диспетчерах прикладных команд.
Но нах юный друг хочет чтобы и сервер и клиент были одновременно и сервером им клиентом.
-
> лочить ничего не надо
Ну как же не надо ?
> все происходит либю в OnExecute, либо в диспетчерах прикладных
> команд
Все это происходит в контексте треда, обслуживающего текущий коннект.
И тред этот и обслуживаемый им коннект полностью изолированы от прочих тредов сервера, обслуживающих как прочие коннекты, так и внутрикухонные нужды сервера. Все эти треды сервера так или иначе, рано или поздно обязательно пересекутся на доступе к тому или иному потоконебезопасному ресурсу, а, значит, потребуется синхронизация. Как она д.б. реализована - то ли локами, то ли синхр.сообщениями, то ли задействованием иных объектов илои способов синхронизации - другой вопрос.
-
Ну это само собой разумеется.
Но я-то про Среадс.ЛокЛист говорил конкретно.
Точнее про то, что он почти никогда не нужен правильному серверу.
-
> про то, что он почти никогда не нужен правильному серверу
С этим солидарен.
-
правильный сервер... я бы вобще не назвал то что мне нужно сервером.
Вобщем ладно, спасибо вам за участие в теме, понял что помощи не будет
-
фигасе заявки. "помощи не будет".
-
> я бы вобще не назвал то что мне нужно сервером
Обзови его хоть горшком - как он был сервером, так он им и останется.
Его задача - обслуживать (to serve) клиентов, если они не в состоянии сами себя обслужить.
> помощи не будет
Тебе уже 68 постов только и делают, что помогают, а ты все не внемлешь.
-
> если бы я писал через TServerSocket я бы не задавал таких
> тупых вопросов
Глубоко в этом сомневаюсь.
Были бы другие, но не менее тупые.
-
Server.Bindings.BindingByHandle(handle : cardinal)
а это что делает?
-
вот что сложного ответить на вопрос как отправить клиенту строку зная либо хендл, либо его адрес, либо его индекс подключения?)
-
что вобще сложного в том сервере который мне нужен? та же структура что и у сервера аси, получил передал сразу вот и всё...
-
получил передал сразу вот и всё...
не сразу, а только по запросу того, кому это предназначалось.
-
Вот я клиент твоей аси.
И Сергей М. тоже клиент.
Я нажимаю кнопку и запрашиваю инфо о контакте Сергея М.
В это время он мне шлет сообщение "Превет Медвет"
Сервер его получает и тут же сразу же мне его шлет.
А я в это время отправил запрос о его профиле и жду его.
А в ответ мне вместо данных его профиля приходит "Превет Медвет".
Я (точнее твой чудо-клиент аси) при этом в полной уверенности что:
1. Получил не сообщение, а инфу о профиле Сергея М
2. Мне не пришло текстовое сообющение от Сергея М
дальше разжевывать надо?
-
ася что ли сидит и спрашивает у сервера есть ли для неё сообщения?
вобще один товарищ посоветровал не возится с таким сервером "посредником" а связать компы не имеющие выделенных адресов через VPN. Тока я еще не совсем дочитал что это такое... так что пойду читать, мб и не нужен будет такой сервер...
-
ася что ли сидит и спрашивает у сервера есть ли для неё сообщения?
Ты лучше спроси как она вообще получает сообщения ничего не запрашивая (якобы) и ничего не читая (якобы).
-
Хотя этот вопрос лишний.
Ты попробуй сначала выкрутится из ситуации, что описана у меня в [75].
Когда в ответ на запрос информации о контакте приходит не инфа о контакте, а "Превет Медвет".
-
ну а что там выкручиться, сложности никакой.
например синтаксис для собщения MSG_<сообщение>, а для инфы INFO_<инфа>, и какой тут напряг? придет себе сообщение, будет оно как сообщение, а инфу по-прежнему ждем
-
> Zalm © (07.09.09 17:51) [72]
А что ты хотел видеть в кач-ве ответа на этот вопрос ?
> а это что делает?
"Это" возвращает binding-структуру с интересующим значением поля handle.
> та же структура что и у сервера аси, получил передал сразу
> вот и всё
Это тебе "сервер ася" сказал ?
Или ты изучил документацию ?
> вот что сложного ответить на вопрос как
А что ты хотел увидеть в кач-ве ответа на вопрос ?
Код ?
Он тебе не поможет, уверяю тебя.
Ты нишиша в нем не поймешь.
Даже если ты сдуешь его "один в один", он у тебя работать не будет.
-
> Это тебе "сервер ася" сказал ?Или ты изучил документацию
> ?
ну нет, я в начале второго курса писал подобие аси... в итоге всё работало нормально. всё передавалось и принималось.
> А что ты хотел увидеть в кач-ве ответа на вопрос ?Код ?Он
> тебе не поможет, уверяю тебя.Ты нишиша в нем не поймешь.
> Даже если ты сдуешь его "один в один", он у тебя работать
> не будет.
почему это? это голословно))) не думаю что это мне не принесет никаких результатов... так что думаю вы ошибаетесь
-
procedure TForm1.Button1Click(Sender: TObject);
var List : TList; i : integer;
begin
try
List := IdCmdTCPServer1.Contexts.LockList;
for i := 0 to Pred(List.Count) do
with TIdContext(List[i]) do
begin
if (Connection.Socket.Binding.PeerIP = '1.2.3.4') and (Connection.Socket.Binding.PeerPort = 1234) then
TIdContext(List[i]).Connection.Socket.Write('привет');
end;
finally
IdCmdTCPServer1.Contexts.UnlockList;
end;
end;
-
> я .. писал ..
Я понимаю, что ты писатель, а не читатель.
> не думаю что это мне не принесет никаких результатов
Ты вообще не думаешь. Вероятно, не спрособен думать.
Иначе давным бы давно реализовал кучу данных тебе подсказок.
> Медвежонок Пятачок © (07.09.09 19:00) [82]
Зря.
Клиент скорее мертв.
К тому он ханделЯми озабочен, а ты ему пир:порт)
-
Сергей что ж вы злой такой?)
Спасибо большое Пятачок)
-
А TidTCPServer имеет какие-то функции\процедуры для подсчета входящего\исходящего трафика? или только руками можно посчитать?
Подскажите пожалуйста)
-
Тотальный подсчет трафика не предусмотрен.
Однако есть события TIdTCPConnection.OnWork , TIdIOHandler.OnWork - их можно приспособить для тотального подсчета прикладного трафика.
-
аа... Спасибо Сергей