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