Серверный поток

Теперь взглянем на функцию ServerThreadProc:

 

UINT ServerThreadProc(LPVOID pParam)

{CSockAddr saClient;

CHttpBlockingSocket sConnect;

char request[100];

 

char headers[] = "HTTP/1.0 200 OKrn"

"Server: Inside Visual C++ EX34Arn"

"Date: %srn"

"Content-Type: text/htmlrn"

"Accept-Ranges: bytesrn"

"Content-Length: 500rn";

"rn"; //очень важная пустая строка

char html[] =

"rn"

"<html>rn"

"<head><title>Inside Visual C++ Server</title></head>rn"

"<body><body background="usa1.jpg">rn"

"<h1><center>This is a custom home page</center></h1><p>rn"

"<a href="default.htm"> SlowSoft’s Home Page</a><p>rn"

"</body></html>rnrn";

 

 

try {

if(!g_sListen.Accept(sConnect, saClient)) {

// обработчик в классе «вид» закрыл ожидающий сокет

return 0;

}

 

AfxBeginThread(ServerThreadProc, pParam);

// прочитать запрос от клиента

sConnect.ReadHttpHeaderLine(request, 100, 10);

TRACE("SERVER: %s", request); //напечатать первый заголовок

 

if(!strncmp(request, "GET", 3)){

do // обработать остальные заголовки запроса

{

sConnect.ReadHttpHeaderLine(request, 100, 10);

TRACE("SERVER: %s", request);

} while(strcmp(request,"rn"));

//*/

sConnect.Write(headers, strlen(headers), 10); // заголовки ответа

sConnect.Write(html, strlen(html), 10); // код HTML

 

}

else {

TRACE("SERVER: not a GETn");

// не знаю, что делать

}

}

catch(CBlockingSocketException* e) {

// Делаем что-то с исключением

e->Delete();

}

// g_sListen.Close();

sConnect.Close();}

Наиболее важным является вызов Accept. Поток кода блокируется до тех пор, пока клиент не подсоединится к порту 80 сервера, после чего Accept вернет новый сокет sConnect. Текущий поток сразу же запускает другой поток.

Между тем текущий поток должен обработать запрос клиента, который пришел на sConnect. Сначала считываются все заголовки запроса путем вызова ReadHttpHeaderLine до тех пор, пока не обнаружится пустая строка. Затем вызывается Write для отправки заголовков и HTML-операторов ответов. Наконец текущий поток вызывает Close для закрытия соединения через сокет. Конец жизни данного соединения. Следующий поток остается блокированным на вызове Accept, ожидая следующего соединения.