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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.07.2010, 12:40   #1
casper0094
Пользователь
 
Регистрация: 19.03.2010
Сообщений: 31
Восклицание ServerSocket Список подключенных клиентов

На Localhoste неполучается получить список подключенных клиентов. Пытаюсь подключить одоного а в списках получается то 3, то 2, то 1. Но после отключения, этого одного который был подключен, всегда один остается в списке подключенных.
Всё делаю так:
Клиент
Код:
procedure TForm1.FormCreate(Sender: TObject);
Var
  Ini : Tinifile;
  Ws : WsaData;
Begin
  Ini := TIniFile.Create(ExtractFilePath(Application.ExeName)+'Ini.ini');
  ClientSocket1.Address := Ini.ReadString('Socket','Adreess','127.0.0.1');
  ClientSocket1.Port := Ini.ReadInteger('Socket','Port',1994);
  Ini.Free;
  WsaStartUp($101, Ws);
  UsePort;
end;

Procedure UsePort;    // Пользуюсь для избежания ошибок при подключении. Тоесть я пытаюсь подключится через socket если получается то закрываю socket и ужу работаю через ClienSocket.

Var
  Sock : tsocket;
  ServerInfo : sockaddr_in;
Begin
  Sock := Socket(af_inet, sock_stream, 0);
  ServerInfo.sin_family := AF_INET;
  ServerInfo.sin_addr.s_addr := inet_addr(PAnsiChar(AnsiString(Form1.ClientSocket1.Address)));
  ServerInfo.sin_port := htons(Form1.ClientSocket1.Port);
  if Connect(Sock, ServerInfo, SizeOf(ServerInfo))=0 then
  begin // подключено
    CloseSocket(Sock);
    Form1.Timer1.Enabled := false;
    Form1.ClientSocket1.Active := true;
  end
  else
  begin // неподключено
    CloseSocket(Sock);
    Form1.Timer1.Enabled := true;
    Form1.ClientSocket1.Active := false;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  UsePort;
end;

procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Form1.ClientSocket1.Active := false;
  Timer1.Enabled := true;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ClientSocket1.Active := false;
end;
Сервер:
Код:
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
Var
  i : longint;
  ListItem : TListItem;
begin
  Status.Panels[0].Text := 'Подключено ' + IntToStr(ServerSocket1.Socket.ActiveConnections);
  Computers.Items.BeginUpdate;
  Computers.Items.Clear;
  Computers.Items.Add.Caption := 'Нет';
  for I := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
  begin
    ListItem := Computers.Items.Add;
    ListItem.Caption := ServerSocket1.Socket.LocalHost;
    ListItem.SubItems.Add(ServerSocket1.Socket.LocalAddress);
  end;
  Computers.ItemIndex := 0;
  Computers.Items.EndUpdate;
end;

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
Var
  i : longint;
  ListItem : TListItem;
begin
  Status.Panels[0].Text := 'Подключено ' + IntToStr(ServerSocket1.Socket.ActiveConnections);
  Computers.Items.BeginUpdate;
  Computers.Items.Clear;
  Computers.Items.Add.Caption := 'Нет';
  for I := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
  begin
    ListItem := Computers.Items.Add;
    ListItem.Caption := ServerSocket1.Socket.LocalHost;
    ListItem.SubItems.Add(ServerSocket1.Socket.LocalAddress);
  end;
  Computers.ItemIndex := 0;
  Computers.Items.EndUpdate;
end;
Если надо могу весь проект выложить.

Последний раз редактировалось casper0094; 17.07.2010 в 12:49.
casper0094 вне форума Ответить с цитированием
Старый 17.07.2010, 13:40   #2
X=Vitamin=X
Пользователь
 
Аватар для X=Vitamin=X
 
Регистрация: 18.11.2006
Сообщений: 32
По умолчанию

Доброго времени суток!
По моему присутствует ошибка в логике: при отключении клиента, в серверной части используй проверку на количество коннектов которое можно загнать в отдельную глобальную переменную и при отсоединении последнего клиента делай клир листа. Это как вариант.
Незнание - рабство, знание - свобода ! ! !
X=Vitamin=X вне форума Ответить с цитированием
Старый 17.07.2010, 13:45   #3
casper0094
Пользователь
 
Регистрация: 19.03.2010
Сообщений: 31
По умолчанию

да я согласен что можно завести отдельный лист на коннекты. Но вопрос почему стандартные средства так себя ведут.
casper0094 вне форума Ответить с цитированием
Старый 17.07.2010, 13:52   #4
X=Vitamin=X
Пользователь
 
Аватар для X=Vitamin=X
 
Регистрация: 18.11.2006
Сообщений: 32
По умолчанию

если честно я некогда тоже столкнулся с таким вопросом и после некоторого поиска ответа просто решил для себя делать все наверняка и как моожно меньше полагаться на стандарты. У меня была похожая ситуация при написании чата для местной ЛАН.
Незнание - рабство, знание - свобода ! ! !
X=Vitamin=X вне форума Ответить с цитированием
Старый 17.07.2010, 14:47   #5
casper0094
Пользователь
 
Регистрация: 19.03.2010
Сообщений: 31
По умолчанию

Тоесть вы писали полностью свой листинг подключеных? Дело в том что если сделать задержку , ну тоесть поставить showmessge('coonnect') на событие подключения и отключения, то всё вроде как получается. Ео небуду же я ставить sleep(1000) при каждом подключении. Тоесть проше свой список составлять? а как передавать сообшения ? я передаю connection[ номер выделенный в listview]? номера то могут несовпадать. Можно ли как нить в SrverSocket передавать по ip подключенного?
casper0094 вне форума Ответить с цитированием
Старый 17.07.2010, 16:12   #6
X=Vitamin=X
Пользователь
 
Аватар для X=Vitamin=X
 
Регистрация: 18.11.2006
Сообщений: 32
По умолчанию

если проэкт небольшой то можно пойти путем мазохизма и своять какой-то доп. стэк(или лист) из записей на каждый коннэкт с номером коннэкта логином и прочей чебурдой. Дело фантазии!
Незнание - рабство, знание - свобода ! ! !
X=Vitamin=X вне форума Ответить с цитированием
Старый 18.07.2010, 00:56   #7
casper0094
Пользователь
 
Регистрация: 19.03.2010
Сообщений: 31
По умолчанию

Ну проект не то что большой, но сокеты играют самую важную роль, поэтому нодобно сделать безотказную систему)
casper0094 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Список DLL подключенных к процессу Horus92 Win Api 9 01.07.2010 09:32
Есть ли у IdTCPServer такое свойство как у ServerSocket: ServerSocket.Socket.ActiveConnectio ns? TwiX Работа с сетью в Delphi 3 07.03.2010 14:28
Вывод количество подключенных к БД Wi1D БД в Delphi 1 12.07.2009 15:55
Программная проверка наличия подключенных устройств EniSh Общие вопросы Delphi 1 28.06.2008 22:09
Создать список клиентов банка Klyan Паскаль, Turbo Pascal, PascalABC.NET 3 15.01.2007 12:45