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 ;> )