TServerSocket - zdażenie OnClientConnected

problemy z tworzeniem programów do obsługi sieci, internetu, e-mail itp..

TServerSocket - zdażenie OnClientConnected

Nowy postprzez Koziol » wtorek, 13 października 2009, 22:08

Witam,
Zastanawia mnie możliwość zapisu jednego z argumentów zdarzenia OnClientConnected, a mianowice podstawowy wygląd funkcji dla zdarzenia wygląda następująco:
Kod: Zaznacz cały
void __fastcall TForm1::ClientConnect(TObject *Sender,
      TCustomWinSocket *Socket)
{

}

Czy zapisując wartość Socket do tablicy możemy się odwołać do poszczególnych klientów
znaczy:
Kod: Zaznacz cały
SocketTab[0]->SendText(); // wyśle tekst do pierwszego połączonego klienta
SocketTab[1]->SendText(); // wyśle tekst do drugiego połączonego klienta
SocketTab[2]->SendText(); // wyśle tekst do trzeciego połączonego klienta
SocketTab[3]->SendText(); // wyśle tekst do czwartego połączonego klienta
itd.


Pomińmy rozłączanie się klientów.

Z góry dziękuje za odpowiedź.
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    NieznanyNieznana

Re: TServerSocket - zdażenie OnClientConnected

Nowy postprzez Cyfrowy Baron » Å›roda, 14 października 2009, 07:42

Powinno chyba być:

Kod: Zaznacz cały
Socket->Connections[x]->SendText


Socket jest jeden, a połączeń może być wiele. Socket wrzuca klientów podłączających się do niego na listę Connections, nadając im kolejne numery, są to w zasadzie kolejne numery listy, a całkowita liczba klientów podłączonych do serwera jest przechowywana w zmiennej Socket->ActiveConnections. Przy identyfikacji klientów należy posłużyć się raczej Socket->RemoteAddress i Socket->RemoteHost.

Nie wiem na ile potrafisz posługiwać się Socketami, więc może przeczytaj sobie w serwisie Cyfrowy Baron dział: kursy praktyczne -> komunikator sieciowy.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: TServerSocket - zdażenie OnClientConnected

Nowy postprzez Koziol » Å›roda, 14 października 2009, 09:30

Kurcze liczyłem że zwraca wskaźnik na konkretne połączenie, no nic trudno. Z góry dzięki za pomoc :)

PS. Czy moge przypisać to w następujący sposób:

SocketTab[1] = Socket->Connections[1]; żeby następnym razem pominąć wyszukiwanie indeksu itd.

Jeżeli tak jakiego typu musi być SocketTab?

TCustomWinSocket, czy jakiÅ› inny?
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    NieznanyNieznana

Re: TServerSocket - zdażenie OnClientConnected

Nowy postprzez Cyfrowy Baron » Å›roda, 14 października 2009, 09:45

Nie mogę sprawdzić bo w C++ Builder 2007 nie ma socketów, można by je co prawda doinstalować, ale nie potrzebuję.

SocketTab[x] musi być taką tablicą jaką jest właściwość Connections obiektu Soskets (można sprawdzić w pomocy), ale to oczywiście nic Tobie zupełnie nie da, gdyż wszystkie elementy tablicy SocketTabs będą przechowywały dokładnie to samo, czyli listę połączeń Connections, wiec będziesz dokładnie w punkcie wyjścia, gdyż połączenia są przechowywane we właściwości Connections obiektu Socket i nie możesz tego zmienić, gdyz taka jest konstrukcja socketów, możesz tylko stworzyć sobie własne listy powiązane w jakiś sposób przez właściwość Connections, o czym chyba pisałem Tobie w innym temacie.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: TServerSocket - zdażenie OnClientConnected

Nowy postprzez Koziol » Å›roda, 14 października 2009, 10:03

Nie do końca stworzyłem liste jednokierunkową w oparciu o klasy i każdy punkt owej listy będzie miał Zakładke np. SocketCon do której było by to przypisywane czyt. mieli byśmy efekt:

User 1{
Name
SocketCon
Next}

User 2{
Name
SocketCon
Next)
itd.
a zapisując w takiej liście mam bardzo ułatwione wysyłanie informacji do poszczegolnych userow znaczy tak schematycznie:

Kod: Zaznacz cały
user2 to user1 text: test text;
search(user1);
if(user1->SocketCon!=NULL)
user1->SocketCon->SendText("user2 to user1 text: test text");
itd.


Mam nadzieje że dobrze myśle :)





EDIT:
jak by ktoś kiedyś szukał:
__property TCustomWinSocket* Connections[int Index] = {read=GetConnections};


Tak więc właściwość Connections jest też typu TCustomWinSocket*. ;)




EDIT2:
A jaką metode wyszukiwawczą byś polecił?

Wymyśliłem że można by zrobić to tak (kod obrazowy):
Kod: Zaznacz cały
Tworzymy strukture:

LoginStr
{
Name;
IP;
etc.
}

Client wysyła ją na serwer zaraz po połączeniu

a na serwerze porównujemy
i=0;
while(!SameText(server1->Socket->Connections[i]->RemoteAddress,LoginStr->IP))
i++;


i w tym momencie mamy wskaźnik [b]i[/b] na odpowiedni socket

Czy taka metoda będzie dobra czy nazbyt obciąży serwer (i jeszcze należało by porównać do ActiveConnections co by nie było błędu ochrony pamięci).
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje sieciowe

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 2 gości