Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.06;
Скачать: CL | DM;

Вниз

Вопрос по взаимодействию по протоколу TCP/IP при помощи сокетов   Найти похожие ветки 

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

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


 
Verg ©   (2004-04-21 08:48) [1]

А чем эти клиенты отличаются? Очевидно 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;


 
Anatoly Podgoretsky ©   (2004-04-21 08:54) [2]

Не очевидно


 
Digitman ©   (2004-04-21 10:46) [3]

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

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

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


 
Anatoly Podgoretsky ©   (2004-04-21 11:28) [4]

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


 
Verg ©   (2004-04-21 11:53) [5]

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


 
Digitman ©   (2004-04-21 12:01) [6]


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


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

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

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


 
Digitman ©   (2004-04-21 12:08) [7]


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


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

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

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


 
Anatoly Podgoretsky ©   (2004-04-21 12:15) [8]

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



Страницы: 1 вся ветка

Текущий архив: 2004.06.06;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.036 c
1-1085404221
Alex_F
2004-05-24 17:10
2004.06.06
Работа с окнами


1-1085240035
zep
2004-05-22 19:33
2004.06.06
операции с числом


14-1085133085
Dmitriy O.
2004-05-21 13:51
2004.06.06
Вопрос по IB


1-1085129166
AlexXn
2004-05-21 12:46
2004.06.06
XML


1-1085396068
Mehriddin
2004-05-24 14:54
2004.06.06
Графика в delphi