Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Индекс клиента в сокетах

1.3K
15 мая 2007 года
Zephyr
104 / / 03.05.2005
Хочу определить - клиентский сокет с каким индексом пишет в данный момент. Делаю так:
В обработчике OnClientRead сервака пишу :
 
Код:
int iAC = ServerSocket1->Socket->ActiveConnections;

for(int i=0; i<iAC; i++)
   {
    if(ServerSocket1->Socket->Connections->RemoteAddress
             == Socket->RemoteAddress) Label1->Caption = IntToStr(i);
   }

Он определяет, но проблема в том, что когда снова пишет клиент, скажем с нулевым индексом, определять не хочет и пишет индекс самого последнего соединения. Как с этим бороться???
1
16 мая 2007 года
kot_
7.3K / / 20.01.2000
Цитата: Zephyr
Хочу определить - клиентский сокет с каким индексом пишет в данный момент. Делаю так:
В обработчике OnClientRead сервака пишу :
 
Код:
int iAC = ServerSocket1->Socket->ActiveConnections;

for(int i=0; i<iAC; i++)
   {
    if(ServerSocket1->Socket->Connections->RemoteAddress
             == Socket->RemoteAddress) Label1->Caption = IntToStr(i);
   }

Он определяет, но проблема в том, что когда снова пишет клиент, скажем с нулевым индексом, определять не хочет и пишет индекс самого последнего соединения. Как с этим бороться???


В каком режиме у тебя работает сокет - асинхронный или блокирующий?

1.3K
16 мая 2007 года
Zephyr
104 / / 03.05.2005
stNonBlocking
1
16 мая 2007 года
kot_
7.3K / / 20.01.2000
Цитата: Zephyr
stNonBlocking


Тогда при подключении клиента тебе необходимо стодавать отдельный поток и в нем обрабатывать все.
Типа

 
Код:
Client = new TClientThreadE(true);
  Client->FreeOnTerminate = true;
  Socket->OnSocketEvent = Client->OnSocketEvents;
  Socket->OnErrorEvent = Client->OnSocketErrorEvents;
  Client->Resume();
  Socket->Data = Client;

в потоке
Код:
void __fastcall TClientThreadE::OnSocketEvents(TObject *Sender,TCustomWinSocket* Socket, TSocketEvent SocketEvent){
        switch(SocketEvent){
         case seRead:
          ReadFromClient(Socket);
          break;
         case seWrite:
          WriteToClient(Socket);
          break;
         case seDisconnect:
          Disconnect(Socket);
        }
 }
void __fastcall TClientThreadE::ReadFromClient(TCustomWinSocket* Socket){

// И здесь уже выполняешь необходимое

}

подробней поищи в инете - нет времени расписывать.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог