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ł: