Главная страница
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.035 c
15-1170505324
Vi
2007-02-03 15:22
2007.02.25
Не могу установить Fplus в Дельфи?


2-1170605257
Гость_
2007-02-04 19:07
2007.02.25
SQL фрагмент


15-1170244018
пластилин глазами хакера
2007-01-31 14:46
2007.02.25
Антивирус


2-1170667972
uncle benc
2007-02-05 12:32
2007.02.25
Invalid pointer operation


1-1167904951
Kolan
2007-01-04 13:02
2007.02.25
Иключения в потоке. Как правильно обрабатывать?