К данному примеру относитесь очень осторожно :-). Я вынес его в отдельный файл, чтобы показать и потом вставить в сервер. Но разбор выражения хотя и сделан на рекурсивной основе далеко не идеален. Но это и не нужно в данный момент. Нам просто из запроса нужно выделить имя файла для чтения и это он делает. Хотя может в каких то случаях и ошибиться. Пишите свои замечания и комментарии. Вот код:
// teststr.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "afx.h" #include "iostream.h" void GetLine(CString Str); void Command(CString Str); void GetCommand(CString Str); void main() { CString s="GET /autor.htm HTTP/1.1\015\012 Accept: application/vnd.ms-excel, */*\015\012\015\012"; GetLine(s); s="GET / HTTP/1.1\015\012 Accept: application/vnd.ms-excel, */*\015\012\015\012"; GetLine(s); s=""; GetLine(s); s="GET\015\012"; GetLine(s); } void GetLine(CString Str) { CString temp=Str; int i= Str.Find("\015\012"); int l=Str.GetLength(); Str.Delete(i,l-i); Command(Str); temp.Delete(0,i+2); if (Str.GetLength() !=0) { if (temp.GetLength()!=0) GetLine(temp); } } void Command(CString Str) { if (Str.Find("GET",0)!=-1) GetCommand(Str); } void GetCommand(CString Str) { int i=Str.Find("/"); if (i != -1) { Str.Delete(0,i+1); i=Str.Find("HTTP"); int l=Str.GetLength(); Str.Delete(i,l-i); cout << Str << endl; } }
Как видите я привел несколько примеров для того, чтобы убедиться, что он работает. Рекурсивно разбирается вся строка, выделяются строки (CRLF) каждая строка анализируется на наличие GET при его наличии она обрезается с обоих сторон для извлечения имени файла. В следующем шаге я просто вставлю эти функции в виде класса в проект. Меня больше интересует, что сервер выдаст строку по запросу и мы обработаем GET.
Написать свой сервер это одно :-)) и требует тщательного кодирования. А вот понимание принципов работы это другое. Мы занимаемся этим я хочу сказать...