Programowanie sieciowe (klient + serwer) C++

Program w C++, kod źródłowy 2 programów: serwera nasłuchującego i klienta. W komentarzach znajdują się objaśnienia do kodu. Aplikacja działa na adresie IP 127.0.0.1. Skompilowany program do pobrania [serwer i klient]

//połączeniowy server
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream.h>
#include <winsock2.h>
#include <conio.h>
#define ROZMIAR_BUFORA_WIADOMOSCI 10
#define winSock_ver MAKEWORD(2,0)
int main(void)
{   WSADATA CurrentSockVer;
    SOCKET s,nowy_s;
    struct sockaddr_in ServerAdress,KlientAdress;
    char *wiadomosc="Tu serwer\n",
         *adres="127.0.0.1",
         bufor_wiadomosci[ROZMIAR_BUFORA_WIADOMOSCI],
         *wskaznik_do_bufora;
    int  dlugosc_bufora_wiadomosci,i;
    cout<<"Serwer aplikacji testowej wystartowal !!!"<<endl;
    cout<<"Inicjacja biblioteki winsock"<<endl;
    //inicjacja biblioteki winsock
    WSAStartup(winSock_ver,&CurrentSockVer);
    cout<<"Tworzymy gniazdko"<<endl;
    //tworzymy gniazdo
    s=socket(AF_INET,SOCK_STREAM,0);
    //ustawienie adresu serwera
    ServerAdress.sin_family=AF_INET;
    ServerAdress.sin_port=htons(2000);
    ServerAdress.sin_addr.s_addr=inet_addr(adres);
    cout<<"Przywiazujemy adres do gniazda"<<endl;
    //przywiazujemy adres serwera do gniazda
    bind(s, (struct sockaddr*)&ServerAdress,sizeof(ServerAdress));
    cout<<"Zaczynamy nasluchiwanie"<<endl;
    //zaczynamy naslychiwac polaczen
    listen(s,1); //1 oznacza ze gniazgo s osluzy tylko 1 klienta
    i=sizeof(KlientAdress);
    //akceptujemy nadchodzace polaczenie
    //nowy_s jest to utworzone gniazdo przez ktore bedziemy sie  komunikowac
    nowy_s=accept(s,(struct sockaddr*)&KlientAdress,&i);
    cout<<"Akceptacja polaczenia"<<endl;
    wskaznik_do_bufora=bufor_wiadomosci;
    dlugosc_bufora_wiadomosci=ROZMIAR_BUFORA_WIADOMOSCI;
    cout<<"Odbieramy dane od serwera"<<endl;
    //odbieramy wiadomosc od klienta
    recv(nowy_s,wskaznik_do_bufora,dlugosc_bufora_wiadomosci,0);
    for (int i=0;i<ROZMIAR_BUFORA_WIADOMOSCI;i++) cout<<*(bufor_wiadomosci+i);
    cout<<"Wysylamy dane od klienta"<<endl;
    //wysylamy wiadomosc do klienta
    send(nowy_s,wiadomosc,strlen(wiadomosc),0);
    cout<<"Zamykamy 2 gniazda"<<endl;
    //zamykamy gniazdka
    closesocket( nowy_s);
    closesocket( s );
    //posprzatanie po winsock
    cout<<"Sprzatamy po winsock"<<endl;
    WSACleanup();
    getch();
}

//połączeniowy klient
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream.h>
#include <winsock2.h>
#include <conio.h>
#define ROZMIAR_BUFORA_WIADOMOSCI 10
#define winSock_ver MAKEWORD(2,0)
int main(void)
{   //deklarujemy zmiene
    WSADATA CurrentSockVer;
    SOCKET s;
    struct sockaddr_in ServerAdress;
    char *wiadomosc="Tu klient\n",
         *adres="127.0.0.1",
         bufor_wiadomosci[ROZMIAR_BUFORA_WIADOMOSCI],
         *wskaznik_do_bufora;
    int  dlugosc_bufora_wiadomosci;
    cout<<"Klient aplikacji testowej wystartowal !!!"<<endl;
    cout<<"Inicjujemy biblioteke winsock !!!"<<endl;
    //inicjacja biblioteki winsock
    WSAStartup(winSock_ver,&CurrentSockVer);
    cout<<"Tworzymy gniazdo !!!"<<endl;
    //tworzymy gniazdo
    s=socket(AF_INET,SOCK_STREAM,0);
    //ustawienie adresu serwera
    ServerAdress.sin_family=AF_INET;
    ServerAdress.sin_port=htons(2000);
    ServerAdress.sin_addr.s_addr=inet_addr(adres);
    cout<<"Nawiazujemy polaczenie z serwerem !!!"<<endl;
    //nawiazujemy połączenie z serwerem
    if(connect(s, (struct sockaddr *)&ServerAdress, sizeof(ServerAdress))==0)
    {
        cout<<"Wysylamy wiadomosc do serwera !!!"<<endl;
        //wysyÅ‚amy wiadomosc do SERWERA
        send(s,wiadomosc, strlen(wiadomosc),0);
        wskaznik_do_bufora=bufor_wiadomosci;
        dlugosc_bufora_wiadomosci=ROZMIAR_BUFORA_WIADOMOSCI;
        cout<<"Odbieramy wiadomosc od serwera !!!"<<endl;
        //odbieramy komunikat od serwera
        recv(s,wskaznik_do_bufora,dlugosc_bufora_wiadomosci,0);
        //wyswietlamy otrzymanÄ… wiadomosc
        for (int i=0;i<ROZMIAR_BUFORA_WIADOMOSCI;i++) cout<<*(bufor_wiadomosci+i);
        cout<<"Zamykamy polaczenie z serwerem !!!"<<endl;
        //zamkniecie polaczenia
        closesocket(s);
        //posprzatanie po winsock
        cout<<"Sprzatamy po winsock !!!"<<endl;
        WSACleanup();
    }
    getch();
}

Dział: