Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.25;
Скачать: CL | DM;

Вниз

Console&Socket   Найти похожие ветки 

 
kernel ©   (2006-09-16 21:41) [0]

Здравствуйте, мастера!

Подскажите, кто-нибудь, как в консольном приложении реализовать нормальную работу ServerSocketClientRead? Я делаю это так:


...
type
TmpClass = class
procedure ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure CStartConsole(Sender: TObject);
end;

var
ServerSocket: TServerSocket;
CTmpClass: TmpClass;
...

procedure TmpClass.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
writeln(":)");
Readln;
end;

procedure TmpClass.CStartConsole(Sender: TObject);
begin
ServerSocket:=TServerSocket.Create(nil);
ServerSocket.ServerType:=stNonBlocking;
ServerSocket.ThreadCacheSize:=10;
ServerSocket.OnClientRead:=ServerSocketClientRead;
ServerSocket.Active:=true;
end;

begin
CTmpClass.CStartConsole(CTmpClass);
end.



,но ServerSocketClientRead при подаче string`а ServerSocket`у срабатывать не хочет :/ . Где я мог допустить ошибку? Заранее благодарен.


 
Ketmar ©   (2006-09-16 21:52) [1]

в отсутствии окон и обработчика оконных сообщений.


 
kernel ©   (2006-09-16 21:54) [2]


> в отсутствии окон и обработчика оконных сообщений.


в отсутствии каких окон?


 
Ketmar ©   (2006-09-16 23:45) [3]

> [2] kernel ©   (16.09.06 21:54)
обыкновенных. а точнее -- в отсутствии цикла GetMesasge()/DispatchMessage().


 
Eraser ©   (2006-09-17 00:55) [4]

> [0] kernel ©   (16.09.06 21:41)

я бы посоветовал либо сделать эфимерное окно, либо отказаться от неблокирующего режима работы сокетов.


 
Ketmar ©   (2006-09-17 01:09) [5]

> [4] Eraser ©   (17.09.06 00:55)
да окно там, по-моему, сам класс создаёт. просто к нему сообщения не доходят. %-)


 
kernel ©   (2006-09-17 08:26) [6]

А если в консольке создать форму с visible=false и на эту форму положить ServerSocket?


 
Ketmar ©   (2006-09-17 08:56) [7]

> [6] kernel ©   (17.09.06 08:26)
а хоть 600 форм. см. [3]. или вызывать Application.Run(), или делать то же самое, но руками.


 
Slym(RO)   (2006-09-18 04:05) [8]

Простой пример:
program CharGen;

{$APPTYPE CONSOLE}

uses
 SysUtils,ScktComp,WinSock;

type
 TServerClientThreadEx=class(TServerClientThread)
 protected
   procedure ClientExecute; override;
 end;

procedure TServerClientThreadEx.ClientExecute;
var i:integer;
begin
 Randomize;
 while (not Terminated) and ClientSocket.Connected do
 begin
   try
     i:=Random(MaxInt);
     ClientSocket.SendBuf(i,SizeOf(i));
   except
     Terminate;
     HandleException;
   end;
 end;
end;

procedure GetThread(Self:TObject;Sender: TObject;ClientSocket: TServerClientWinSocket; var SocketThread: TServerClientThread);
begin
 writeln("GetThreadEvent ",ClientSocket.RemoteAddress,":",ClientSocket.RemotePort);
 SocketThread:=TServerClientThreadEx.Create(false,ClientSocket);
end;

function Proc2Method(Code, Data: Pointer):TMethod;
begin
 result.Code:=Code;
 result.Data:=Data;
end;

var Server:TServerWinSocket;
begin
 Server:=TServerWinSocket.Create(INVALID_SOCKET);
 try
   Server.ThreadCacheSize := 10;
   Server.OnGetThread:=TGetThreadEvent(Proc2Method(@GetThread,Server));
   Server.Listen("", "", "", StrToIntDef(ParamStr(1),19), SOMAXCONN);
   while Server.Connected do
    Sleep(100);
 finally
   Server.Free;
 end;
end.



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

Текущий архив: 2007.02.25;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.038 c
6-1158240246
progmax
2006-09-14 17:24
2007.02.25
Direct connect через IdMappedPortTCP


15-1170356427
adsl
2007-02-01 22:00
2007.02.25
Трафик


15-1170421303
Дж.
2007-02-02 16:01
2007.02.25
Счетчик


2-1171019204
kot_michael
2007-02-09 14:06
2007.02.25
Добавление пользователей в AD


11-1148567746
GigAl
2006-05-25 18:35
2007.02.25
HTML и KOL