//////////////////////////////////////////////////////////////////////////////////////////////
// //
/////////////////////////////////////////////////////////////////////////////////////////////
#include "CServer.h"
//Constructor, Destructor
CServer::CServer() {}
CServer::~CServer() {}
///////////////////////////////////////////////////////////////////////////////////////////////
//Khoi dong WinSock
int CServer::InitWinSock()
{
WSADATA wsData;
//Khoi dong winsock phien ban 2.2
int iResult = WSAStartup(MAKEWORD(2, 2), &wsData);
if(iResult != 0)
{
cout << "Loi khoi dong WinSock" << endl;
WSAGetLastError(); //Xac dinh ro thong tin loi~
return 1;
}
else
cout << "Khoi dong WinSock thanh cong!" << endl;
return 0;
}
//Khoi tao Socket
int CServer::InitSocket()
{
//Khoi tao Socket ( TCP/IP )
sSockServer = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sSockServer == INVALID_SOCKET)
{
cout << "Loi khoi tao Socket" ;
WSAGetLastError();
WSACleanup(); //Khong the khoi tao duoc Socket ta huy WinSock
return 1;
}
else
cout << "Khoi tao Socket thanh cong !" << endl;
return 0;
}
//Khoi dong WinSock & khoi tao Socket, ha`m tra ve` ma~ loi~
int CServer::Start()
{
if(this->InitWinSock())
return 1;
if(this->InitSocket())
return 1;
return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////
//Dan dia chi cuc bo tren Socket (ket buot Socket voi 1 Port tren Server)
int CServer::Bind()
{
ServerAddr.sin_family = AF_INET; //Dung IP de truyen du lieu
ServerAddr.sin_port = htons(PORT); //port 80 (web)
ServerAddr.sin_addr.s_addr = INADDR_ANY; //Lay IP cua may'
iServerLength = sizeof(ServerAddr); //Lay kich thuoc cua dia chi cua Server
int iResult = bind(sSockServer, (struct sockaddr*) &ServerAddr, iServerLength);
if(iResult == SOCKET_ERROR) //bind tra ve SOCKET_ERROR khi bi loi~
{
cout << "Khong ket buoc duoc Socket va Port!" << endl;
WSAGetLastError();
this->End();
return 1;
}
return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////
//Lang nghe ket noi tai Port 80 ....
int CServer::Listen()
{
//Lang nghe tren Socket, hang doi toi da BAKLOG 5
int iResult = listen(sSockServer, BACKLOG);
if(iResult == SOCKET_ERROR)
{
cout << "Khong the lang nghe ket noi !" << endl;
WSAGetLastError();
return 1;
}
//cout << "Dang lang nghe ket noi... tai IP: " << inet_ntoa(ServerAddr.sin_addr) << " PORT: " << ServerAddr.sin_port << "\nCTRL + C de STOP SERVER\n\n" ;
printf("Server listening ....");
return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////
//Xu li
void CServer::Service()
{
//Thong tin cua Client
SOCKET sSockClient;
struct sockaddr_in ClientAddr;
int iClientLength;
//Tien hanh lang nghe tren Socket cua Server
if(this->Listen())
return;//Lang nghe that bai thoat khoi ham
//Buffer luu tru lai thong tin request cua Client
char arrBufRevc[1024] = {0};
//Headers cua trang web gui di
char arrHeaders[] = "HTTP/1.0 200 OK\r\n"
"Server: PhuocTai Winsock Server\r\n"
"Date: Fri, 16 November 2007\r\n"
"Content-Type: text/html\r\n"
"Accept-Ranges: bytes\r\n"
"Content-Length: 187\r\n"
"\r\n";
//Du lieu chinh gui di
char arrData[] = "<html>"
"<head><title>MY WEBSERVER - WINSOCK C++ - Phuoc Tai</title></head> \r\n"
"<body>\r\n"
"<h1>HELLO WORLD !</h1>\r\n"
"<br>\r\n"
"You just call out my name and you know wherever I am<br> \r\n"
"phuoctaitp@gmail.com\r\n"
"</body>\r\n"
"</html>\r\n\n";
//Vong lap vo han cho` request cua Client va` tra loi`
while (1)
{
iClientLength = sizeof(ClientAddr);
sSockClient = accept(sSockServer, (struct sockaddr*) &ClientAddr, &iClientLength);
if (sSockClient == -1)
{
cout << "Loi ket noi tu Client\n";
continue;
}
cout << "Nhan ket noi tu: "<< inet_ntoa(ClientAddr.sin_addr) << endl;
//Xoa noi dung Request truoc va nhan Request moi (luu trong Buffer)
memset(arrBufRevc, 0, sizeof(arrBufRevc));
recv(sSockClient, arrBufRevc, sizeof(arrBufRevc) ,0);
/*
Xu Ly Request po tay !
*/
//Gui cho Client Web (headers + Data)
send(sSockClient, arrHeaders, sizeof(arrHeaders),0);
send(sSockClient, arrData, sizeof(arrData),0);
//Xuat ra man hinh noi dung cua request Client gui toi
cout << "\nNoi dung nhan: \n" << endl;
cout << arrBufRevc << endl;
//Dong ket noi' (huy Socket cua Client)
closesocket(sSockClient);
}
}
///////////////////////////////////////////////////////////////////////////////////////////////
//Huy Sockket
void CServer::CloseSocket()
{
closesocket(sSockServer);
cout << "Huy Socket ! " << endl;
}
//Huy WinSock
void CServer::CloseWinSock()
{
WSACleanup();
cout << "Huy WinSock !" << endl;
}
//Ket thuc ket noi huy Socket sau do huy Winsock
void CServer::End()
{
this->CloseWinSock();
this->CloseSocket();
}