![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]в отсутствии окон и обработчика оконных сообщений.