// BPPA_SERVER.cpp : Defines the entry point for the console application.
//
// xsiebe03 (FEKT)
// xrusna02 (FIT)
#include <iostream>
#include <stdio.h>
#include <windows.h>
#include <string>
#include <winsock.h>
#include <fstream>
#pragma comment (lib,"WS2_32.lib")
#define BUFSIZE 1000
using namespace std;
int main(int argc, char *argv[])
{
WORD wVersionRequested = MAKEWORD(1,1); // Číslo verze
WSADATA data; // Struktura s info. o knihovně;
std::string text; // Přijímaný text
sockaddr_in sockName; // "Jméno" soketu a číslo portu
sockaddr_in clientInfo; // Klient, který se připojil
SOCKET mainSocket; // Soket
int port; // Číslo portu
char buf[BUFSIZE]; // Přijímací buffer
int size; // Počet přijatých a odeslaných bytů
int addrlen; // Velikost adresy vzdáleného počítače
int count = 0; // Počet připojení
while(1){
if (WSAStartup(wVersionRequested, &data) != 0)
{
cout << "Nepodarilo se inicializovat sokety" << endl;
return -1;
}
port = 80;
if ((mainSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))
== INVALID_SOCKET)
{
cerr << "Nelze vytvorit soket" << endl;
WSACleanup();
return -1;
}
// Zaplníme strukturu sockaddr_in
// 1) Rodina protokolů;
sockName.sin_family = AF_INET;
// 2) Číslo portu, na kterém čekáme
sockName.sin_port = htons(port);
// 3) Nastavení IP adresy lokální síťové karty, přes kterou
// je možno se připojit.
// Nastavíme možnost připojit se odkudkoliv.
sockName.sin_addr.s_addr = INADDR_ANY;
//přiřadíme soketu jméno
if (bind(mainSocket, (sockaddr *)&sockName, sizeof(sockName))
== SOCKET_ERROR)
{
cerr << "Problem s pojemnovanim soketu" << endl;
WSACleanup();
return -1;
}
// Vytvoříme frontu požadavků na spojení.
// Vytvoříme frontu maximální velikosti 10 požadavků.
cout << "Nasloucham na portu:" << port << endl;
if (listen(mainSocket, 10) == SOCKET_ERROR)
{
cerr << "Problem s vytvorenim fronty" << endl;
WSACleanup();
return -1;
}
// Poznačím si velikost struktury clientInfo.
// Předám to funkci accept.
addrlen = sizeof(clientInfo);
// Vyberu z fronty požadavek na spojení.
// "client" je nový soket spojující klienta se serverem.
SOCKET client = accept(mainSocket, (sockaddr*)&clientInfo,
&addrlen);
int totalSize = 0;
if (client == INVALID_SOCKET)
{
cerr << "Problem s prijetim dat" <<endl;
WSACleanup();
return -1;
}
// Zjistím IP adresu klienta.
cout << "Nekdo se pripojil z adresy: "
<< inet_ntoa((in_addr)clientInfo.sin_addr) << endl;
// Přijmu data. Ke komunikaci s klientem používám soket
// "client"
text = "";
// Prijmuti dat od clienta
for (int i=0;i<BUFSIZE;i++)
buf[i] = 0;
while (totalSize <= 50)
{
if ((size = recv(client, buf, BUFSIZE-1, 0))
== SOCKET_ERROR)
{
cerr << "Problem s prijetim dat." << endl;
WSACleanup();
return -1;
}
cout << "Prijato:" << size << endl;
totalSize += size;
text.append(buf);
}
//segmentace textu ze zpravy klienta
int zero=text.find('\n');
text.erase(zero);
string cesta;
int zero3 = text.rfind(' ');
text.erase(zero3);
zero = text.find('/');
cesta.append(text,zero+1,(text.length())-(zero+1));
cout << endl << "Obsah pole je:" << cesta << endl;
//Prace se souborem
ifstream myfile;
string line,obsah;
myfile.open (cesta.c_str());
if (myfile.is_open())
{
while (! myfile.eof() )
{
getline (myfile,line);
obsah +=line;
obsah +='\n';
}
cout << "Obsah souboru:" << endl << obsah;
myfile.close();
}
else
{
myfile.close();
myfile.clear();
myfile.open ("404.html");
if (myfile.is_open())
{
while (! myfile.eof() )
{
getline (myfile,line);
obsah +=line;
obsah +='\n';
}
cout << "Obsah souboru:" << endl << obsah;
myfile.close();
}
}
string OK = "HTTP/1.1 200 OK\r\nAccept-ranges: bytes\r\nContent-length: 82\r\nContent-type: text/html\r\n";
// Odeslu potvrzeni komunikace
if ((size = send(client, OK.c_str(), OK.length(), 0))==SOCKET_ERROR)
{
cerr << "Problem s odeslanim dat" << endl;
WSACleanup();
return -1;
}
if ((size = send(client, obsah.c_str(), obsah.length(), 0))==SOCKET_ERROR)
{
cerr << "Problem s odeslanim dat" << endl;
WSACleanup();
return -1;
}
cout << "Odeslano: " << size << endl;
// Uzavřu spojení s klientem
closesocket(client);
cout << "Koncim" << endl << endl << endl;
closesocket(mainSocket);
WSACleanup();
}
return 0;
}