Форум: "Сети";
Текущий архив: 2007.02.25;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.039 c