Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ TServerSocket, вопрос

Автор: Unconnected 28.02.2009 3:03

У TServerSocket есть свойство ActiveConnections. К подключениям можно обращаться как TServersocket1.Socket.activeConnection[1].sendtext('!');. Так вот, допустим, к серверу подключился клиент, потом ещё один и ещё один. Потом первый клиент отключился и опять подключился. Каким по счёту он будет в ActiveConnections?

Автор: volvo 28.02.2009 4:04

Цитата
К подключениям можно обращаться как TServersocket1.Socket.activeConnection[1].sendtext('!');.
Неправда... Свойство ActiveConnection вообще не присутствует, а ActiveConnections - это обычное целое число... Как минимум, надо обращаться вот так:
  ServerSocket1.Socket.Connections[1].SendText('!');

Цитата
допустим, к серверу подключился клиент, потом ещё один и ещё один. Потом первый клиент отключился и опять подключился. Каким по счёту он будет в ActiveConnections?
А тебе не все равно? Зачем тебе знать, каким он будет? Ты что завязываешься на его положение в массиве? Глупо... Привязывайся к SocketHandle для идентификации клиента, так будет гораздо надежнее... Пример - здесь: http://www.delphirus.com/article5.html

Автор: Unconnected 28.02.2009 12:49

Цитата
А тебе не все равно? Зачем тебе знать, каким он будет? Ты что завязываешься на его положение в массиве? Глупо...


Ага, глупо, только понял я это только когда сервер начал отправлять сообщение не тому клиенту, которому нужно, основываясь на положении его в ЛистБоксе, т.е. какое положение - тому равен ActiveConnections для отправки(ну connections[i], хотя там по другомуsmile.gif). А SocketHandle - это как бы имя сокета? И чему оно равно?

Всё, понял, это Handle клиента, приславшего сообщение.

А как можно узнать SocketHandle того или иного клиента? В примере этого не было..

Автор: Unconnected 1.03.2009 3:38

Всё, разобрался.. Разъясните пожалуйста ещё одну вещь, можно ли создать поток именно в директории программы? Создаю например fsy:=TfileStream.Create(yname,fmcreate); , (yname - это ВСЕГДА просто имя файла, без путей, типа ReadMe.txt). Так вот, файл может создаваться как в текущей директории, так и в директории, где последний раз "побывал" TOpenDialog... С чем это связано, я не знаю.. Можно ведь указать какой-то относительный путь, чтобы файл создавался в директории программы?

Автор: volvo 1.03.2009 3:50

Цитата
С чем это связано, я не знаю..
С тем, что TOpenDialog/TSaveDialog меняют системные переменные.
Цитата
Можно ведь указать какой-то относительный путь, чтобы файл создавался в директории программы?
Можно... Для этого тебе надо будет просто сделать:
fsy:=TfileStream.Create(ExtractFilePath(ParamStr(0)) + yname, fmcreate);


Автор: Unconnected 1.03.2009 15:42

Спасибо, работает good.gif Как же много вещей, которые просто знать надо..

Автор: Unconnected 5.03.2009 0:04

Не стал поднимать новую тему, т.к. проблема относится к сокетам.

Так вот, моя программа передаёт файлы и сообщения между компьютерами, но: когда я подключаюсь к себе через Localhost в качестве "хоста" для TClientSocket, то всё нормально, файлы передаются, сообщения тоже доходят. Когда же подключаюсь к удалённому компьютеру по IP-адресу, то сообщения доходят, а передача файлов ведёт себя как-то странно. Чаще всего вообще не передаёт. Вот я и задумался, ведь подключение через Интернет ничем не хуже "loopback" соединения.. И подозрение пало на KIS 7. Больше никакого "оборонного" софта не установлено. (Windows XP SP3). Есть подозрение, что он не пропускает большое количество пакетов за раз (сообщения при включенном KIS доходят нормально). Может, у него такая "защита" от DDos-атак? Никто не сталкивался с подобным?

Автор: volvo 5.03.2009 0:10

Цитата
Больше никакого "оборонного" софта не установлено
А ты встроенному FireWall-у WinXP SP3 сказал, что твои файлы надо пропускать? Я даже сообщения не мог передавать, пока не внес свою программу в список его исключений, не говоря уже о файлах. Или он у тебя отключен? Control Panel -> Windows Firewall, проверь.

Автор: Unconnected 5.03.2009 0:14

Сразу оговорюсь, что SP3 не был интегрирован, я его дополнительно устанавливал. А брандмауэр у меня включён, но там как бы вместо стандартного используется KIS, так и написано, KIS включён. Сам брандмауэр Windows отключен. К тому же, на свой компьютер я передавать могу.. Или это другое?

Автор: Unconnected 5.03.2009 1:17

Кстати, различные Интернет-приложения (ICQ) он ведь впускает в сеть..

Автор: volvo 5.03.2009 1:50

Цитата
Кстати, различные Интернет-приложения (ICQ) он ведь впускает в сеть..
Он впускает ровно то, что указано в его списке исключений или в правилах (KIS-а у меня никогда не было, я не знаю, куда именно там надо заходить, но все брандмауэры работают по схожим схемам), или по имени программы, или по номеру порта. Не обращал внимание никогда, что при первом запуске какой-либо программы Firewall спрашивает, "что делать с программой <...>, которая рвется в сеть через порт №<...>"?

Проверь настройки KIS, и разреши своей программе отправлять сообщения.

Автор: Unconnected 5.03.2009 2:07

Так у меня то пропускает без вопросов..Вопрос в том, может ли антивирус одни пакеты (мессаджи) пропускать, а другие (файлы) задерживать?