Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.12.2016, 19:03   #1
Legeardo
Пользователь
 
Регистрация: 04.10.2016
Сообщений: 76
По умолчанию багаеться ServerSocket1

У меня на событие ServerSocket1ClientConnect стоит такой код:
Код:
  ListBox1.Clear;
  for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do
    ListBox1.Items.Add(ServerSocket1.Socket.Connections[i].RemoteAddress);
Решил потестить с другум. Дал ему программу клиент она коннектиться к серверу, а сервак показывает что подключился не 1 ip аддрес а несколько. Например:
265.11.225.78
265.11.225.78
265.11.225.78
265.11.225.78
265.11.225.78
То есть по идее подключается 1 ip и 1 раз. А сервер почему то думает что этот ip подключается множество раз. И да из тех ip что подключились рабочий только 1. Я пробовал отсылать сообщение на эти ip но рабочий ip на который отсылались сообщения был только 1.
Legeardo вне форума Ответить с цитированием
Старый 27.12.2016, 12:30   #2
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

Цитата:
Сообщение от Legeardo Посмотреть сообщение
И да из тех ip что подключились рабочий только 1. Я пробовал отсылать сообщение на эти ip но рабочий ip на который отсылались сообщения был только 1.
Погодите если у вас все 5 Ip одинаковые как рабочий только 1? Порт сменить попробуйте. МБ к серваку с вашего же ПК стороннее ПО цепляется . Пакость например какая-нибудь. При таком раскладе может быть что 5 одинаковых IP а рабочий 1. Потому что 1 ваш клиент остальные 4 подключения гадость. Ну и важно знать как вы подключаетесь, не исключено что например сами открыли 5 активных подключений.

1. При запуске серверной части и отключенной клиентской кол-во подключений сколько?
2. Все 5 коннектов появляются сразу при старте клиентской части?
3. ПРи событии OnDisconect переписываете ListBox1?
Пишу много и развернуто

Последний раз редактировалось Heneken87; 27.12.2016 в 12:48.
Heneken87 вне форума Ответить с цитированием
Старый 27.12.2016, 13:50   #3
Legeardo
Пользователь
 
Регистрация: 04.10.2016
Сообщений: 76
По умолчанию

1. Когда сервер запущен, а клиентская часть отключенная то подключений 0.
2. Нет. Все 5 коннектов появляются постепенно. Но быстро.
3. Переписываю. У меня на дисконект такой же код как и на коннект
Код:
ListBox1.Clear;
  for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do
    ListBox1.Items.Add(ServerSocket1.Socket.Connections[i].RemoteAddress);
И да кстати такое явление не у всех. Я дал клиента другому другу тут коннектится только 1 ip. как и нужно

Последний раз редактировалось Legeardo; 27.12.2016 в 13:54.
Legeardo вне форума Ответить с цитированием
Старый 27.12.2016, 13:52   #4
Legeardo
Пользователь
 
Регистрация: 04.10.2016
Сообщений: 76
По умолчанию

Ну правда пришлось поместить этот код в таймер с интервалом 1 с. и запускать при дисконекте. Если просто вставить этот код в событие дисконект то работает не корректно
Legeardo вне форума Ответить с цитированием
Старый 27.12.2016, 14:09   #5
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

Как вариант проблему с задвоением можно решить так
Код:
ListBox1.Clear;
 for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do
if ListBox1.items.IndexOf(ServerSocket1.Socket.Connections[i].RemoteAddress)<0 then
ListBox1.Items.Add(ServerSocket1.Socket.Connections[i].RemoteAddress);
С компонентами ServerSocket граблей всегда было много. Если подключение не разрывается явно(битый пакетик -действия антивирусника к примеру), событие дисконекта может не отработать, а РЕконнект выполняется-отсюда дубли.(Это к предположению почему у вас 5 у друга нормально 1). Тут нужен коммент того,кто более плотно занимался ServerSocket и разобрал его по винтикам, попробуйте посмотреть в строну Indy компонентов, они постабильнее в этом вопросе и по синтаксису мало чем отличаются.


P/S/ У меня была подобная ситуация,только на INdy. При разрыве соеденения (вытащить LAN кабель. Блок от фаервола) не работал корректно дисконект,точнее вообще не отрабатывал. Проблему решил временами опрашивая клиентов со стороны сервера. Список активных подключений вел в отдельном массиве.Коннект добавлял запись в массив,дисконект удалял из массива. Опрос с стороны сервера подчищал массив на случай если кто-то отпал нештатным образом
Пишу много и развернуто

Последний раз редактировалось Heneken87; 27.12.2016 в 14:54.
Heneken87 вне форума Ответить с цитированием
Старый 27.12.2016, 16:17   #6
Replicant
Форумчанин
 
Аватар для Replicant
 
Регистрация: 17.08.2009
Сообщений: 139
По умолчанию

Писал чат на сокетах, никаких граблей по ходу дела не встречал, с коннектами тоже все было прозрачно. Возможно ваш товарищ запускает несколько копий клиента? Попробуйте при коннекте передавать из клиента строку авторизации и рубить если такой коннект уже есть, само собой с записью в лог. Или запретить повторный запуск клиента. Или идентифицируйте подключения своего клиента, чтобы знать он к вам стучится или вирусня с ПК товарища.
Replicant вне форума Ответить с цитированием
Старый 27.12.2016, 18:46   #7
Legeardo
Пользователь
 
Регистрация: 04.10.2016
Сообщений: 76
По умолчанию

Так а как быть если не рабочий ip подключился и уже рабочий ip подключиться не сможет. Ну это если использовать такой код

Код:
ListBox1.Clear;
 for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do
if ListBox1.items.IndexOf(ServerSocket1.Socket.Connections[i].RemoteAddress)<0 then
ListBox1.Items.Add(ServerSocket1.Socket.Connections[i].RemoteAddress);
Legeardo вне форума Ответить с цитированием
Старый 27.12.2016, 18:51   #8
Replicant
Форумчанин
 
Аватар для Replicant
 
Регистрация: 17.08.2009
Сообщений: 139
По умолчанию

Не рабочий IP (любой левый коннект) не передаст вам строку авторизации которую передает клиент, соответственно вы его обрубите.
Replicant вне форума Ответить с цитированием
Старый 27.12.2016, 19:18   #9
Legeardo
Пользователь
 
Регистрация: 04.10.2016
Сообщений: 76
По умолчанию

Все. Я понял о чем вы))
Legeardo вне форума Ответить с цитированием
Старый 27.12.2016, 23:37   #10
Legeardo
Пользователь
 
Регистрация: 04.10.2016
Сообщений: 76
По умолчанию

С коннектом понятно. А как определить отключился рабочий ip или не рабочий? У меня ip которые прислали строку с инфой о себе заносятся в листбокс. В листбокс помещается ip клиента. Так вот когда отключается не рабочий ip то с листбокса удаляется рабочий. У меня на дисконнекте проверяется что если ip отлюченного клиента совпадает с ip в листбоксе то ip удаляется с листбокса. Вот как то так
Legeardo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Диалоговое окно ServerSocket1 aank10 C++ Builder 7 12.04.2012 13:59
ServerSocket1.Open; и ServerSocket1.Active := True; Shouldercannon Общие вопросы Delphi 1 21.04.2011 16:43
ServerSocket1 ClientSocket1 blackstersl Общие вопросы Delphi 4 18.09.2008 11:06
ClientSocket1 и ServerSocket1 Stanislav Работа с сетью в Delphi 14 14.01.2008 03:31