int iAC = ServerSocket1->Socket->ActiveConnections;
for(int i=0; i<iAC; i++)
{
if(ServerSocket1->Socket->Connections->RemoteAddress
== Socket->RemoteAddress) Label1->Caption = IntToStr(i);
}
Индекс клиента в сокетах
В обработчике OnClientRead сервака пишу :
Код:
Он определяет, но проблема в том, что когда снова пишет клиент, скажем с нулевым индексом, определять не хочет и пишет индекс самого последнего соединения. Как с этим бороться???
Цитата: Zephyr
Хочу определить - клиентский сокет с каким индексом пишет в данный момент. Делаю так:
В обработчике OnClientRead сервака пишу :
Он определяет, но проблема в том, что когда снова пишет клиент, скажем с нулевым индексом, определять не хочет и пишет индекс самого последнего соединения. Как с этим бороться???
В обработчике OnClientRead сервака пишу :
Код:
int iAC = ServerSocket1->Socket->ActiveConnections;
for(int i=0; i<iAC; i++)
{
if(ServerSocket1->Socket->Connections->RemoteAddress
== Socket->RemoteAddress) Label1->Caption = IntToStr(i);
}
for(int i=0; i<iAC; i++)
{
if(ServerSocket1->Socket->Connections->RemoteAddress
== Socket->RemoteAddress) Label1->Caption = IntToStr(i);
}
Он определяет, но проблема в том, что когда снова пишет клиент, скажем с нулевым индексом, определять не хочет и пишет индекс самого последнего соединения. Как с этим бороться???
В каком режиме у тебя работает сокет - асинхронный или блокирующий?
stNonBlocking
Цитата: Zephyr
stNonBlocking
Тогда при подключении клиента тебе необходимо стодавать отдельный поток и в нем обрабатывать все.
Типа
Код:
Client = new TClientThreadE(true);
Client->FreeOnTerminate = true;
Socket->OnSocketEvent = Client->OnSocketEvents;
Socket->OnErrorEvent = Client->OnSocketErrorEvents;
Client->Resume();
Socket->Data = Client;
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){
// И здесь уже выполняешь необходимое
}
switch(SocketEvent){
case seRead:
ReadFromClient(Socket);
break;
case seWrite:
WriteToClient(Socket);
break;
case seDisconnect:
Disconnect(Socket);
}
}
void __fastcall TClientThreadE::ReadFromClient(TCustomWinSocket* Socket){
// И здесь уже выполняешь необходимое
}
подробней поищи в инете - нет времени расписывать.