Форум: "Сети";
Текущий архив: 2007.12.02;
Скачать: [xml.tar.bz2];
ВнизTServerSocket and TClientSocket Найти похожие ветки
← →
paradox01 (2007-03-12 07:55) [0]Имеется программа сервер (TServerSocket), к нему через сокеты подключаются клиентские (TClientSocket) приложения. Клиенты при подключении отправляют «UserName». Вопрос: куда удобнее записывать данные о пользователях (Имя, IP адрес)? Чтобы потом отправить файл конкретному клиенту или всем клиентам сразу.
← →
Сергей М. © (2007-03-12 08:46) [1]
> куда удобнее
Что значит "удобнее" ?
← →
paradox01 (2007-03-12 09:31) [2]Если я не ошибаюсь данные о клиентах можно хранить в массивах с привязкой к handle сокета или использовать свойство - Data. Меня интересует, как это эффективнее реализовать? Если можно в примерах покажите.
← →
Сергей М. © (2007-03-12 09:53) [3]
type
TClientInfo = ^TClientInfo;
TClientInfo = packed recordUserName: String;
...
end;
В обработчике OnClientConnect:
var
ClientInfo: PClientInfo;
..
New(ClientInfo);
Socket.Data := ClientInfo;
В обработчике OnClientDisconnect:var
ClientInfo: PClientInfo;
..
Dispose(ClientInfo);
В событии OnClientRead:
PClientInfo(Socket.Data).UserName := переданная клиентом строка, содержащая имя пользователя;
IP-адрес активного клиента хранить не нужно - его адрес всегда (в любом из событий OnClientConnect/Read/Write/Disconnect/Error) доступен в св-ве Socket.RemoteAddress
← →
paradox01 (2007-03-12 12:53) [4]
> В обработчике OnClientDisconnect:
> var ClientInfo: PClientInfo;
> ..
> Dispose(ClientInfo);
Здесь по конкретнее можно? Может так:
Dispose(Socket.Data);
← →
Сергей М. © (2007-03-12 13:06) [5]
> paradox01 (12.03.07 12:53) [4]
>
>
А ты попробуй)
← →
paradox01 (2007-03-12 13:56) [6]Я уже попробовал ошибку не выдает, но я не уверен, освободился ли на самом деле память выделенный New(ClientInfo).
Как освободить выделенную память?
← →
Сергей М. © (2007-03-12 14:42) [7]
> я не уверен, освободился ли на самом деле память
Почему ?
← →
Empleado © (2007-03-12 17:43) [8]
> paradox01 (12.03.07 12:53) [4]
>
> Здесь по конкретнее можно? Может так:
> Dispose(Socket.Data);
>Сергей М. © (12.03.07 14:42) [7]
Чисто технический вопрос:
Если уж так как указано "> Dispose(Socket.Data)", то так будет правильнее - Dispose(PClientInfo(Socket.Data)), чем просто Dispose(Socket.Data)?
Или однофигственно?...
Ведь должен же Dispose знать ЧТО он освобождает и что там находится (long strings, arrays, s.o.), чтобы их финализировать.
← →
Сергей М. © (2007-03-13 08:11) [9]
> Empleado © (12.03.07 17:43) [8]
Да, ты прав. Приведение типов я упустил.
← →
Сергей М. © (2007-03-13 08:58) [10]
> Empleado © (12.03.07 17:43) [8]
Стоп.
> Если уж так как указано "> Dispose(Socket.Data)",
Где это указано ?
В приведенном мной коде такого нет ..
← →
Empleado © (2007-03-13 11:05) [11]>Сергей М. © (13.03.07 08:58) [10]
Не в твоем примере.
В [4] paradox01 (12.03.07 12:53) предложил избавляться от созданных данных таким образом:
> Здесь по конкретнее можно? Может так:
> Dispose(Socket.Data);
Это было к этому.
Всего доброго.
← →
SlymRO © (2007-03-13 13:17) [12]ServerType какой?
если stThreadBlocking то лучше чемTSCThread=class(TServerClientThread)
private
//Хранить тут данные о пользователях
protected
procedure ClientExecute; override;
end;
не придумали...
или непосредственно в переменных в теле ClientExecute;
← →
paradox01 (2007-03-14 08:19) [13]Всем спасибо помогли!
← →
alexkdpu (2007-04-01 13:58) [14]как законектится, передать запрос типа "GET / HTTP1.1" и т.д. и полученый ответ сервера записать в переменную s с помощью компонента TClientSocket. Пример если можно, спс
← →
alexkdpu (2007-04-01 14:01) [15]как законектится, передать запрос типа "GET / HTTP1.1" и т.д. и полученый ответ сервера записать в переменную s с помощью компонента TClientSocket. Пример если можно, спс
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2007.12.02;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.042 c