Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.30;
Скачать: CL | DM;

Вниз

ServerSocket, где ошибка?   Найти похожие ветки 

 
Dmitriy_R   (2003-04-24 13:54) [0]

Вот пример кода, не могу понять где ошибка. Все стартует но 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.


 
Palladin ©   (2003-04-24 14:02) [1]

а почему это вообще должно работать?


 
Dmitriy_R   (2003-04-24 14:05) [2]

Ну вот я как бы и прошу помощи, что я делаю не так? Чтобы все это заработало...


 
Digitman ©   (2003-04-24 14:21) [3]


> Dmitriy_R


сразу же за строчкой, активирующей сервер, должен идти классический цикл ожидания/выборки/диспетчеризации Win-сообщений.

только не говори, что понятия не имеешь. с чем это едят)



 
Palladin ©   (2003-04-24 14:26) [4]


> Dmitriy_R (24.04.03 14:05)

если уж пишеш консольное то и работай с сокетами на API уровне


 
Dmitriy_R   (2003-04-24 14:43) [5]

Если честно Palladin то пишу сервис под вин 2к, дабы с сервисом я все разобрался и он работает (установка,удаление , перезапуск) я лишнее исключил из кода, пытаясь разобратся с тем что должен делать мой (сервис) в данном случае консольное приложение... Но нигде не иогу найти ни описания ни примера как работать с Сокетами из консольного приложения. Тоесть если бы была форма тут все без проблемм...
Digitman и в самом деле я не совсем понял о чем идет речь.

Если честно может кто примерчик черкнет махонький... Чтобы разоьраться что к чему...


 
Palladin ©   (2003-04-24 14:50) [6]

ЯХДР
сервис...
без знаний от цикле PeekMessage (GetMessage), без базовых знаний о системе...
наберись лучше знаний побольше...


 
Polevi ©   (2003-04-24 15:01) [7]

посмотри Application.Run


 
Dmitriy_R   (2003-04-24 15:02) [8]

Удалено модератором
Примечание: Давай ка без наездов, или иди на www.flame,xx


 
Digitman ©   (2003-04-24 15:04) [9]


> Чтобы разоьраться что к чему


открывай модуль Forms на реализации метода TApplication.ProcessMessages - и разбирайся на здоровье) ... чем не пособие ?


 
Dmitriy_R   (2003-04-24 15:16) [10]

Да я как бы и не хотел наежать, оно как то невзначай получилось.
Ладно, пополз сам разбираться, спасибо и на том....


 
Digitman ©   (2003-04-25 11:50) [11]


> Dmitriy_R



> Ладно, пополз


ползи и пытайся попутно осознать, что консольное приложение по умолчанию не имеет главного окна, поэтому по умолчанию и не требует организации цикла ожидания/диспетчеризации/обработки сообщений, адресуемых системой потокам/окнам консольного процесса. Если же некий кодовый поток консольного процесса создал объект TServerSocket, то в ходе его создания будет создано невидимое окно для того. чтобы гнезда в составе этого объекта могли и меть возможность при посредничестве опер.системы посылать в это окно сообщения о своем тек.состоянии. А поскольку окно безусловно будет создано, это в обязательном порядке потребует от тебя организации вышеупомянутого цикла.

Здесь всплывает и другой "неприятный" момент. Постольку создаваемое объектом TServerSocket окно - невидимое, то оно не сможет иметь фокус ввода. Это означает, что в момент ожидания оконных сообщений в упомянутом цикле ты никогда не дождешься сообщений от клавиатуры/мыши, и в результате консольное приложение в момент циклических вызовов ф-ции ожидания будет "слепо" и "глухо". А ожидать сообщения окну от гнезд и при этом одновременно ожидать клавиатурных событий в вызванной ф-ции readln() невозможно - для каждого кодового потока процесс только одна ф-ция м.б. вызвана в каждый момент времени : либо ф-ция ожидания сообщения либо readline(). Отсюда напрашивается решение проблемы - создавать доп.код.поток, в котором будет происходить полноценная работа с TServerSocket (включая организацию упомянутого цикла), а осн.код.поток конс.процесса при этом сможет оперативно реагировать на клав.события, "вися" на вызове readln()



Страницы: 1 вся ветка

Текущий архив: 2003.06.30;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.017 c
1-97619
SkyRanger
2003-06-19 14:08
2003.06.30
Access Violation и все тут, млин....


1-97608
inspirion
2003-06-19 12:16
2003.06.30
курсор мыши


1-97662
AFrolov
2003-06-17 12:05
2003.06.30
Подскажите аналог в C++ Builder


3-97540
Def
2003-06-05 17:22
2003.06.30
BDE установка алиаса


14-97799
Asteroid
2003-06-11 15:20
2003.06.30
Где можно скачать LightWave?