Na projekt składają się dwie aplikacje:
                          Chat Server i  Chat Client
                 

Uruchamiając serwer podajemy adres i numer portu.
Protokół chat'a oparty jest o nasza własną klasę CProtocolUnit, nie jest w żadnym stopniu zgodny ze standardem IRC'a zawartym w RFC1459.

Opis protokołu:

<komenda> <spacja> <argument krotki> <spacja> <argument długi>

Komendy: 

ERROR           serwer wysyła do klienta, gdy podany nick jest już wykorzystywany lub gdy klient próbuje 'mowić' przed
                       użyciem JOIN 


    
                    <ERROR> <spacja> <numer błędu> <spacja> <komunikat>

SAY                klienci do serwera: klient użył JOIN, ma swój nick i chce rozmawiać
                      serwer do klientów: serwer odebrał tekst od jednego klienta i rozsyła do wszystkich z listy                    

                        <SAY> <spacja> <NICK> <spacja> <TEXT>

WHISPER        klient do serwera: klient chce przesłać tekst tylko do jednej osoby z listy
                       serwer do klienta: serwer przesyła tekst do adresata

                        <WHISPER> <spacja> <ADRESAT> <spacja> <TEXT>

JOIN               klient do serwera: gdy uzyskał połączenie z serwerem i chce dołączyć się do dyskusji
                       serwer do klientów: serwer powiadamia klientów, ze nowy klient dołączył do dyskusji

                       klient-serwer: <JOIN> <spacja> <NICK> 
                       serwer-klient: <JOIN> <spacja> <NICK> <spacja> <TEXT>

NICK               klient do serwera: klient chce zmienić nick
                       serwer do klienta: zawiadamia, że nastąpiła zmiana nick'a klienta

                       klient-serwer: <NICK> <spacja> <NEW NICK>
                       serwer-klient: <NICK> <spacja> <OLD NICK> <spacja> <NEW NICK>

BYE                 klient do serwera: nie służy do zakończenia sesji z serwerem, a jedynie do wyj?cia z trybu SAY
                       serwer do klienta: powiadamia, że dany użytkownik wyłączył się z rozmowy

                       klient-serwer: <BYE> <spacja> <NICK>
                       serwer-klient: <BYE> <spacja> <NICK> 

LIST                klient-serwer: klient prosi o listę użytkowników połączonych z serwerem
                       serwer-klient: serwer wysyła listę użytkowników za każdym razem, gdy podłącza się nowa osoba,
                       rozłącza się, zmienia nick

                       klient-serwer: <LIST> 
                       serwer-klient: <LIST> <spacja> <lista nickow w postaci CString> 

WELCOME      serwer-klient: serwer wysyła potwierdzenie, ze sesja rozpoczęta

                       <WELCOME>

DOWN             serwer-klient: w momencie zatrzymania serwera, tuż przed usunieciem gniazd, wysyłana jest
                       wiadomoć do klientów, ze serwer zakończył prac?ć 

                       <DOWN>

W klasie CProtocolUnit jest metoda Extract, dzieki której z CString uzyskujemy komendę i argumenty.
Polecenia analizowane są przez funkcje:
ReceiveFromClent(CString&) (w aplikacji Chat Server)
ReceiveFromServer(CString&) (w aplikacji Chat Client) 

Do obsługi połączeń i wymiany informacji między klientem i serwerem wykorzystywane są klasy CClientSock i CServerSock. Schemat dziedziczenia:
-CObject
           -CAsyncSocket
                        -CSocket
                                   -CClientSock (CServerSock)

Po stronie serwera:

              1.   tworzymy gniazdo nasłuchujące:
                                  wywoływana jest funkcja Create(numer_portu)

               2.  nasłuchiwanie:
                                  wywoływana jest funkcja Listen()

               3.  akceptowanie nowego klienta
                                  wywoływana jest funkcja OnAccept
                                  tworzone jest gniazdo do porozumiewania się z tym wła?nie klientem 

               4.  wymiana informacji
                                  klient-serwer
                                            poprzez OnReceive, wewnątrz tej funkcji wywoływana jest ReceiveFromClient
                                  serwer-klient
                                            poprzez SendString, wewnątrz SendString jest wywoływana funkcja Send



Po stronie klienta:

               1.  tworzymy gniazdo do komunikacji z serwerem:
                                  wywoływana jest funkcja Create()
                                  to gniazdo nie jest jeszcze z niczym połączone

               2.  aby połączyć gniazdo klienta z serwerem używamy:
                                  Connect(adres_serwera, numer_portu)

               3.  wymiana informacji
                                  serwer-klient
                                            poprzez OnReceive, wewnątrz tej funkcji wywoływana jest ReceiveFromServer
                                  klient-serwer
                                            poprzez SendString, wewnątrz SendString jest wywoływana funkcja Send

W naszym programie argumentem przesyłanym miedzy klientem i serwerem był zawsze obiekt typu CString, nie korzystalismy z klasy CArchive.