Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
6-97764
[BAD]Angel
2003-04-23 19:20
2003.06.30
Включение DHCP и отказ от статических адресов


1-97651
R
2003-06-20 06:42
2003.06.30
Создание свойств в компаненте


3-97526
eLVik
2003-06-06 11:38
2003.06.30
Помогите разобраться SQL


1-97698
bpv
2003-06-17 16:37
2003.06.30
количество свойств в компоненте


1-97734
Evil_forever
2003-06-17 19:15
2003.06.30
отсчёт Time





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский