![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ServerSocket, где ошибка? [D6, Win2k]
Dmitriy_R © (2003-04-24 13:54:00)Вот пример кода, не могу понять где ошибка. Все стартует но ServerSocket подключение не видит :-(
Тоесть со стороны клиента вроде как подключился а вот со стороны сервера ничего не обрабатывает...
program Socket;
{$APPTYPE CONSOLE}
uses
Windows,
SysUtils,
ScktComp;
type
TMyObject = class
public
procedure ServerSocketAccept(Sender: TObject; Socket: TCustomWinSocket);
procedure ServerSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure ServerSocketClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
procedure ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
end;
var
ServerSocket: TServerSocket;
MyObject: TMyObject;
ErrorLogFileName: string;
procedure ErrorLog(Msg: string);
var
fLog: THandle;
BitesWriten: DWORD;
begin
fLog:= CreateFile(PChar(ErrorLogFileName), GENERIC_WRITE, FILE_SHARE_WRITE, nil, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if fLog = INVALID_HANDLE_VALUE then exit;
SetFilePointer(fLog, 0, nil, FILE_END);
Msg:= Msg + #13#10;
WriteFile(fLog, Msg[1], Length(Msg), BitesWriten, nil);
CloseHandle(fLog);
end;
procedure TMyObject.ServerSocketAccept(Sender: TObject;
Socket: TCustomWinSocket);
begin
//
ErrorLog("Adress..." + Socket.RemoteAddress);
end;
procedure TMyObject.ServerSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
//
ErrorLog("Connect...");
end;
procedure TMyObject.ServerSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
//
ErrorLog("Disconnect...");
end;
procedure TMyObject.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var a: string;
begin
//
a := Socket.ReceiveText;
ErrorLog(a);
end;
begin
ErrorLogFileName:= ParamStr(0);
ErrorLogFileName:= Copy(ErrorLogFileName, 1, length(ErrorLogFileName)-3) + "Log";
ErrorLog("StartProg...");
ServerSocket := TServerSocket.Create(nil);
ServerSocket.Port := 10000; // Порт взят от болды
ServerSocket.ServerType := stNonBlocking;
MyObject := TMyObject.Create;
ServerSocket.OnAccept:= MyObject.ServerSocketAccept;
ServerSocket.OnClientConnect := MyObject.ServerSocketClientConnect;
ServerSocket.OnClientDisconnect := MyObject.ServerSocketClientDisconnect;
ServerSocket.OnClientRead := MyObject.ServerSocketClientRead;
WriteLn("Server v0.1");
try
ServerSocket.Active := True;
readln; // Жду нажатия Enter, Для завершения программы.
ServerSocket.Active := False;
finally
ServerSocket.Free;
MyObject.Free;
end;
end.
Digitman (2003-04-25 11:50:00) [1]
> Dmitriy_R
> Ладно, пополз
ползи и пытайся попутно осознать, что консольное приложение по умолчанию не имеет главного окна, поэтому по умолчанию и не требует организации цикла ожидания/диспетчеризации/обработки сообщений, адресуемых системой потокам/окнам консольного процесса. Если же некий кодовый поток консольного процесса создал объект TServerSocket, то в ходе его создания будет создано невидимое окно для того. чтобы гнезда в составе этого объекта могли и меть возможность при посредничестве опер.системы посылать в это окно сообщения о своем тек.состоянии. А поскольку окно безусловно будет создано, это в обязательном порядке потребует от тебя организации вышеупомянутого цикла.
Здесь всплывает и другой "неприятный" момент. Постольку создаваемое объектом TServerSocket окно - невидимое, то оно не сможет иметь фокус ввода. Это означает, что в момент ожидания оконных сообщений в упомянутом цикле ты никогда не дождешься сообщений от клавиатуры/мыши, и в результате консольное приложение в момент циклических вызовов ф-ции ожидания будет "слепо" и "глухо". А ожидать сообщения окну от гнезд и при этом одновременно ожидать клавиатурных событий в вызванной ф-ции readln() невозможно - для каждого кодового потока процесс только одна ф-ция м.б. вызвана в каждый момент времени : либо ф-ция ожидания сообщения либо readline(). Отсюда напрашивается решение проблемы - создавать доп.код.поток, в котором будет происходить полноценная работа с TServerSocket (включая организацию упомянутого цикла), а осн.код.поток конс.процесса при этом сможет оперативно реагировать на клав.события, "вися" на вызове readln()
Dmitriy_R (2003-04-24 15:16:00) [2]Да я как бы и не хотел наежать, оно как то невзначай получилось.
Ладно, пополз сам разбираться, спасибо и на том....
Digitman (2003-04-24 15:04:00) [3]
> Чтобы разоьраться что к чему
открывай модуль Forms на реализации метода TApplication.ProcessMessages - и разбирайся на здоровье) ... чем не пособие ?
Dmitriy_R (2003-04-24 15:02:00) [4]Удалено модератором
Примечание: Давай ка без наездов, или иди на www.flame,xx
Polevi (2003-04-24 15:01:00) [5]посмотри Application.Run
Palladin (2003-04-24 14:50:00) [6]ЯХДР
сервис...
без знаний от цикле PeekMessage (GetMessage), без базовых знаний о системе...
наберись лучше знаний побольше...
Dmitriy_R (2003-04-24 14:43:00) [7]Если честно Palladinто пишу сервис под вин 2к, дабы с сервисом я все разобрался и он работает (установка,удаление , перезапуск) я лишнее исключил из кода, пытаясь разобратся с тем что должен делать мой (сервис) в данном случае консольное приложение... Но нигде не иогу найти ни описания ни примера как работать с Сокетами из консольного приложения. Тоесть если бы была форма тут все без проблемм...
Digitmanи в самом деле я не совсем понял о чем идет речь.
Если честно может кто примерчик черкнет махонький... Чтобы разоьраться что к чему...
Palladin (2003-04-24 14:26:00) [8]
> Dmitriy_R (24.04.03 14:05)
если уж пишеш консольное то и работай с сокетами на API уровне
Digitman (2003-04-24 14:21:00) [9]
> Dmitriy_R
сразу же за строчкой, активирующей сервер, должен идти классический цикл ожидания/выборки/диспетчеризации Win-сообщений.
только не говори, что понятия не имеешь. с чем это едят)
Dmitriy_R (2003-04-24 14:05:00) [10]Ну вот я как бы и прошу помощи, что я делаю не так? Чтобы все это заработало...
Palladin (2003-04-24 14:02:00) [11]а почему это вообще должно работать?