Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Console&Socket [D6, D7, Win2k, WinXP]


kernel ©   (2006-09-16 21:41:00) 

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

Подскажите, кто-нибудь, как в консольном приложении реализовать нормальную работу 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`у срабатывать не хочет :/ . Где я мог допустить ошибку? Заранее благодарен.


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

Простой пример:
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.


Ketmar   (2006-09-17 08:56:00) [2]

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


kernel   (2006-09-17 08:26:00) [3]

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


Ketmar   (2006-09-17 01:09:00) [4]

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


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

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

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


Ketmar   (2006-09-16 23:45:00) [6]

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


kernel   (2006-09-16 21:54:00) [7]


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


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


Ketmar   (2006-09-16 21:52:00) [8]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо