Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по взаимодействию по протоколу TCP/IP при помощи сокетов [D5, D6]


Горе Программист ©   (2004-04-21 08:12:00) 

Следующая ситуация:
Есть сервер и 3 клиента (Клиент1, Клиент2, Клиент3). Клиенты подключаются и отключаются в беспорядке (кому как вздумается). Вопрос - как определить у какого клиента какой номер соединения? Другими словами - если первому клиенту нужно отправить строку S, то команда такая: ServerSocket1.Socket.Connections[N].SendText(S); Но вот чему равно N?
Отправлять всем троим эту строку запрещено условием......


Anatoly Podgoretsky   (2004-04-21 12:15:00) [1]

Да будут разные и уникальные, значения для идентификации определяются во врема подключения. Других вариантов для уникальной идентиыикации, чем сокет (так тоже же иногда называют пару адрес:порт) нет. Не ИП ни порт сами по себе не уникальны, индекс тоже не уникален, изменяется при добавление, удалении подсоединений.


Digitman   (2004-04-21 12:08:00) [2]


> Verg ©   (21.04.04 11:53) [5]


ну разный, да ... это в дан.случае неважно, главное - уникально идентифицировать клиента в пределах всей сессии работы сервера и в пределах списка активных клиентов в данной сессии ...

но лучше таки вообще не заниматься ерундой с адресами-портами, а ориентироваться на прикладной смысл уникальной идентификации, например, по некоему логину клиента ... о чем я и упомянул в [6]

перебрал список Connections[], сравнил у каждого из его эл-тов прикл.структуру, на которую ссылается св-во Data , с заданной структурой (в структуре хранится уник.логин, например, 'Вася Пупкин') и при первом же совпадении - Connections[i].Send ... все ! более ничего и не требуется


Digitman   (2004-04-21 12:01:00) [3]


> Горе Программист


если ты пишешь нечто подобное чату, в котором требуется реализовать некий механизм "приватных сообщений", то оперировать (для уникальной идентификации клиента) номерами соединений, равно как и их адресами-портами попросту неразумно

ведь каждый клиент у тебя идентифицируется в этом случае, например, уникальным ником, который "закреплен" за клиентом на всем протяжении сеанса связи с сервером

достаточно хранить в св-ве Data объекта TServerClientWinSocket инф-цию о нике клиента, с которым установлено уник.соединение через этот самый уникальный TServerClientWinSocket-объект - и никакие адреса-порты-номера уже не потребуются


Verg   (2004-04-21 11:53:00) [4]

У клиента, когда он делает connect, сокету назначается локальный порт из временного диапозона любой (произвольный) свободный.
Т.о. со стороны сервера RemotePort у клиентского слкета от подключения к подключению будет разным даже у одного и того же клиента.


Anatoly Podgoretsky   (2004-04-21 11:28:00) [5]

Digitman ©   (21.04.04 10:46) [3]
А вот это уже очевидно, это единственно что обеспечивает.


Digitman   (2004-04-21 10:46:00) [6]

клиенты могут сидеть за прокси
или на одной кл.машине стартовано несколько экз-ров кл.части
в обоих случаях ip-адрес у них , скорее всего, будет один и тот же

в такой ситуации очевидней будет комбинация RemoteAddress + RemotePort

if (ServerSocket1.Socket.Connections[N].RemoteAddress = Ip)
and (ServerSocket1.Socket.Connections[N].RemotePort = Port) then


Anatoly Podgoretsky   (2004-04-21 08:54:00) [7]

Не очевидно


Verg   (2004-04-21 08:48:00) [8]

А чем эти клиенты отличаются? Очевидно IP адресами.
И если есть потребность отправить что-то клиенту с таким-то IP адресом, то

function TForm1.SendStringToIp(const Ip, Str : string):boolean;
var N : integer;
begin
 result := false;
 for N:=0 to ServerSocket1.Socket.ActiveConnections - 1 do
  if ServerSocket1.Socket.Connections[N].RemoteAddress = Ip then
  begin
    result := ServerSocket1.Socket.Connections[N].SendText(Str) > 0;
    break;
  end;
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо