Текущий архив: 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