TCPClient->Socket->WriteLn(...)
String command = AContext->Connection->Socket->ReadLn();
ShowMessage(command);
Klienta możesz identyfikować po jego IP.
Przecież, by serwer mógł się komunikować z konkretnym klientem musi mieć jego IP (...)
(...) zewnętrzne lub lokalne
Jak wielu klientów może mieć to samo IP w tej samej sieci?
//---------------------------------------------------------------------------
AnsiString TForm3::GetLocalIP(void)
{
AnsiString retVal;
WSAData wsaData;
if(!WSAStartup(MAKEWORD(1, 1),&wsaData))
{
char BufHost[80];
if(gethostname(BufHost, sizeof(BufHost)) != SOCKET_ERROR)
{
hostent *phe = gethostbyname(BufHost);
if(phe)
{
in_addr addr;
for(int i = 0; phe->h_addr_list[i] != 0; i++)
{
CopyMemory(&addr, phe->h_addr_list[i], sizeof(in_addr));
if(i > 0) AppendStr(retVal, ".");
AppendStr(retVal, inet_ntoa(addr));
}
}
}
}
WSACleanup();
return retVal;
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button1Click(TObject *Sender)
{
TCPClient->Host = IPSerwer->Text ;
TCPClient->Connect();
TCPClient->Socket->WriteLn("ConnectUser;" + Login->Text +";" + Pass->Text + ";" + GetLocalIP());
}
//---------------------------------------------------------------------------
void __fastcall TForm3::TCPServerConnect(TIdContext *AContext)
{
MemoZdarzenia->Lines->Add("Podłączono clienta");
}
//---------------------------------------------------------------------------
void __fastcall TForm3::TCPServerDisconnect(TIdContext *AContext)
{
MemoZdarzenia->Lines->Add("Rozłączono clienta");
}
//---------------------------------------------------------------------------
void __fastcall TForm3::TCPServerExecute(TIdContext *AContext)
{
TCPServer->Active = true;
String line = AContext->Connection->Socket->ReadLn();
String ip, login, pass;
int b = 0;
b = line.LastDelimiter("ConnectUser");
if(b != 0)
{
int a = 0;
line.Delete(1,12); // Usuwanie polecenia z lini
a = line.LastDelimiter(";"); // zwraca pozycje ostatniego ';'
ip = line;
ip.Delete(1, a); // otrzymujemy adres ip
line.Delete(a, line.Length()); // usuwa ostatni ';' i adres ip
a = line.LastDelimiter(";"); // zwraca pozycje ostatniego ';'
pass = line;
pass.Delete(1, a); // otrzymujemy haslo
line.Delete(a, line.Length()); // usuwa ostatni ';' i haslo
login = line;
int i = 0;
while(Uzytkownik[i].get_id())
{
if(login == Uzytkownik[i].get_login() && pass == Uzytkownik[i].get_pass())
{
// Jak zwrócić użytkownikowi dane o udanym logowaniu ??
MemoZdarzenia->Lines->Add("Zalogowano: " + Uzytkownik[i].get_name() + ", adres ip: " + ip);
break;
}
i++;
}
}
}
//---------------------------------------------------------------------------
1. Czy zdarzenie TCPServerExecute dotyczny sytuacji gdy serwer otrzymuje jakieś dane?
4. Jak zakomunikować poprawne logowanie do serwera tylko konkretnemu clientowi
// w TCPServerExecute po akceptacji loginu i hasła
AContext->Connection->Socket->WriteLn("LOGGED IN");
TCPClient->Connect();
TCPClient->Socket->WriteLn("ConnectUser;" + Login->Text +";" + Pass->Text + ";" + GetLocalIP());
String line = TCPClient->Socket->ReadLn();
if(line != "LOGGED IN")
{
/* FUCK! */
}
(...) ale z tego co jest mi wiadome po kursach Cisco, za NAT urządzenie i tak wie komu dalej wysłać pakiet bo jest coś takiego jak (MAC) adres fizyczny który również znajduje się obok adres IP.
Wracając do tematu, zadbam o to aby każda aplikacja miała adres zewnętrzny.
Co będzie bardziej efektywne przesyłanie Stringów czy binarnie?
Czytałem o wielowątkowości aplikacji, czy takie rozwiązanie powinno znaleźć się w tej aplikacji?
private:
void __fastcall ApplicationIdle(TObject *Sender, bool &Done);
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Application->OnIdle = ApplicationIdle;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ApplicationIdle(TObject *Sender, bool &Done)
{
// zadania;
}
Cyfrowy Baron napisał(a):Możesz wykorzystać zdarzenie OnIdle aplikacji, czyli wykorzystujące proces bezczynności systemu.
help napisał(a):TApplication::OnIdle
Occurs when an application becomes idle. /.../ Write an OnIdle event handler to perform special processing when an application is idle. An application is idle when it is not processing code. For example, an application is idle when it is waiting for input from the user.
Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość