Проект мы оставим старый нам нужно внести изменения всего в одну функцию OnServerAccept:
afx_msg LRESULT CHTTPServerView::OnServerAccept(WPARAM wParam, LPARAM lParam) { CHTTPServerDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); HTTPServer.clientsocket = INVALID_SOCKET; pDoc->csInfo = "Client Connect !!!!!"; Invalidate(); if (WSAGETASYNCERROR(lParam)) { AfxMessageBox("Error detecting Client"); return 0L; } if (WSAGETSELECTEVENT(lParam) == FD_ACCEPT) { int length=sizeof(SOCKADDR); SOCKADDR_IN socketclientaddr; HTTPServer.clientsocket=accept(HTTPServer.servsocket, (LPSOCKADDR)&socketclientaddr, (LPINT) &length); if (HTTPServer.clientsocket == INVALID_SOCKET) { AfxMessageBox("Invalid Client Socket"); return 0L; } CString buff="<html>\n<p>Сайт шаг за шагом представляет\n</html>\r\n"; HTTPServer.SendData(buff.GetBuffer(1000)); closesocket(HTTPServer.clientsocket); } return 0L; }
Вот код в процедуру передаются параметры, в том числе и что произошло обращение FD_ACCEPT. В самом начале мы проверяем параметры. И если все нормально accept для создания сокета клиента. После чего можно посылать данные. Посылку данных я вынес в отдельную процедуру.
void CSeverWinSock::SendData(LPSTR buff) { int Errors; Errors = send(clientsocket,(LPSTR)buff,lstrlen(buff),0); if (Errors == SOCKET_ERROR) AfxMessageBox("Error Send"); }
После посылки данных сокет можно закрыть. В большой степени абстракции можно весь данный процесс со стороны сервера представить как:
socket() bind() WSAAsyncSelec() linten() if accept send() closecoket()
Вот такой результат работы нашего сервера. Только одно предупреждение. После запуска подождите немного. И иногда при запросе сервер не отвечает. Но очень редко. Есть и еще одна мелочь. После обращения к серверу в каталоге Windows\Internet Temporary помешается временный файл. Если хотите тестировать удаляйте его после каждого обращения, иначе страница будет загружаться оттуда. Имя её будет IP, который вы вводили для обращения к серверу.