Taka mała ciekawostka...

0

Witam,

zawsze mnie zastanawiała taka sprawa:
*Mam sobie server i klientów dwóch. I dajmy ze w serverze jest ListViewa z kolumna np."Stat" i jak zrobic ze klient nr.1. wysyła numerek np.1 (ze jest niedostepny) do kolumny w serverze "Stat", a klient nr.2 odczytuje to i daje rysunek odpowiedny do numerka

To jest tak z ciekawosci bo bardzo chciałbym sie dowiedziec:-)

1

IMHO i AFAIC: ;>
(nie korzystam z ListView, tylko ze zwyklej niegraficznej listy (swoja droga normalnie to chyba nie jest lista tylko cos szybszego.,.. stawiam na drzewo avl albo tablice rozproszona... ale nie bede komplikowal)
na servie mamy siakas tam strukturke z danymi o userze i strukt do linkowania userow

struct user_st;

typedef struct link_st
{
  struct user_st *user;
  struct link_st *next;
} link, *plink;

typedef struct user_st
{
  unsigned int numereq; // numer/id usera
  unsigned int stan; // ten twoj stat // jego stan
  int sock; // NULL jesli nie polaczony, inaczej socket
  ... tutaj jakies tam imie etc ...
  plink *kontakty; // wskaznik na pierwszy element listy kontaktow usera
  struct user_st *next; // wskaznik na nastepnego usera
}

nyo i mamy sobie cala liste useroow.. u klienta mamy tylko ta druga strukture bez "plink *kontakty"..

poza tym mamy wyenumowane stany (i tu i tu) i wyenumowane polecenia

enum
{
  NIEMA, JEST, UKRYTY, NIEDOSTEPNY
};

enum
{
  ZMIEN_STAN, WYSLI_WIADOMOSC, etc...
}

i teraz...
w servie mamy petle

while( server_must_die_now )
{
  for( i = pierwszy_el_listy_polaczonych; i; i = i->next ) // po kolei dla wszystkich polaczonych userow...
  {
     ret = recv( i->sock, buforek, sizeof( buforek ), NULL );
     if( ret == 0 ) odlacz_usera( &i ); // jesli sie rozlaczyl to go wylacz 
     else if ( ret == -1 ) continue; // idz dalej jesli nic nie chce
     else 
      {
      // zalozmy ze pierwszym elementem w buforek jest char okreslajacy polecenie, a drugim jest parametr (tez char dla ulatwienia);
       if( buforek[ 0 ] == ZMIEN_STAN ) // jesli user chce zmienic stan
       {
           i->stan = buforek[ 1 ];
           wyslij_mnie [ 0 ] = ZMIEN_STAN;
           wyslij_mnie [ 1 ] = i->stan;
           wyslij_mnie [ 2 ] = i->numereq; // numer usera ktory zmienil stan;
            for( j = i->kontakty; j; j=j->next ) // do kazdego z listy kontaktow
            {
                send( j->user->sock, wyslij_mnie, 3, NULL ); // wyslij info o zmianie stanu
            }
        }
       }

w sumie tyle u serva..
natomiast klient ma podobny kod ktory oczekuje na polecenia, a jesli odbierze info o zmianie stanu ktoregos usera, to zmienia mu obrazek...
czyli calosc dziala tak:
zalozmy ze mamy 3ch uzytkownikow, o numerach 1 2 i 3
kazdy ma nastepujace wpisy w liscie kontaktow
1 -> 2
2 -> 1, 3
3 -> 1, 2
czyli 1 ma na liscie kontaktow usera 2, 2 ma na liscie 1 i 3 a 3 ma 1 i 2 ;>

2 stwierdza ze chce byc niedostepny, wysyla wiec do serva pakiet:
2 -> S [ ZMIEN_STAN, NIEDOSTEPNY ]
serv odbiera pakiet i wysyla pakiet o tym ze 2 zmienil stan dla wszystkich z jego listy kontaktowej (1 i 3 )
S -> 1 [ ZMIEN_STAN, NIEDOSTEPNY, 2 ]
S -> 3 [ ZMIEN_STAN, NIEDOSTEPNY, 2 ]
1, 3 zmieniaja obrazek przy nicku 2giego na swojej graficznej liscie kontaktow (oraz w strukcie odpowiednie pole ofc)

mam nadzieje ze w miare jasno to wytlumaczylem... ofc kod jest czysto przykladowy i mozna go troszq lepiej bylo napisac (np zamiast if buforek[0] == ZMIEN_STAN ) .. else if ( buforek[0] == COSTAM ) else etc... zrobic tablice wskaznikow do funkcji i func[ buforek[ 0 ] ] ( i, buforek ); nyo ;> )

0

dzieki:-)

lol ale fajne :d po raz pierwszy ktos mi dał taki wykład;p

1 użytkowników online, w tym zalogowanych: 0, gości: 1