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
//połączeniowy klient
//połączeniowy server
#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();
}
#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ł: