오히려 C++에 익숙하지 않고 문제가 생겼습니다. 브라우저를 사용하여 서버에 연결하면 응답이 잘 보내고 브라우저에서 문제없이 보입니다. 그것이 웹 페이지를 두 번 보낸 콘솔, 페이지 뷰 카운터가 이것을 확인합니다. 테스트에서 실행 순서가 확실하지 않습니다. 새로운 연결을 듣기C++ winsock multithread http server
루프 :
while (true){
//create temp scoket for cconnetcion
SOCKET ClientSocket;
ClientSocket = INVALID_SOCKET;
// Accept the socket from the client when it tries to connect
ClientSocket = accept(ListenSocket, NULL, NULL);
printf("NEWCON");
if (ClientSocket == INVALID_SOCKET) {
printf("accept failed: %d\n", WSAGetLastError());
std::string blah;
std::cin >> blah;
closesocket(ListenSocket);
WSACleanup();
return 104;
}
views += 1;
AfxBeginThread(RequestProsorses, (LPVOID)ClientSocket);
}
RequestProsorses 기능 :
UINT RequestProsorses(LPVOID pParam){
printf("\n NEWREC");
SOCKET ClientSocket = (SOCKET)pParam;
#define DEFAULT_BUFLEN 512
char recvbuf[DEFAULT_BUFLEN];
int conResult, iSendResult;
int recvbuflen = DEFAULT_BUFLEN;
std::string returnVal = "HTTP/1.x 200 OK \n Transfer-Encoding: chunked \n\n <html><body><b>Total Page Views:</b>";
conResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
if (conResult > 0) {
printf("Bytes received: %d\n", conResult);
//create response to user
returnVal += std::to_string(views) + "</body></html>";
//printf(returnVal.c_str());
// Send Responce to user
iSendResult = send(ClientSocket, returnVal.c_str(), returnVal.length(), 0);
if (iSendResult == SOCKET_ERROR) {
//printf("send failed: %d\n", WSAGetLastError());
std::string blah;
std::cin >> blah;
closesocket(ClientSocket);
WSACleanup();
}
printf("Bytes sent: %d\n", iSendResult);
}
else if (conResult == 0){
printf("Connection closing...\n");
}
else {
printf("recv failed: %d\n", WSAGetLastError());
std::string blah;
std::cin >> blah;
closesocket(ClientSocket);
WSACleanup();
}
// shutdown the send half of the connection since no more data will be sent
conResult = shutdown(ClientSocket, SD_SEND);
if (conResult == SOCKET_ERROR) {
printf("shutdown failed: %d\n", WSAGetLastError());
closesocket(ClientSocket);
WSACleanup();
}
closesocket(ClientSocket);
return 0;
}
콘솔 출력 (형태 하나만 뷰)
NEWCONNEWCON
NEWREC
NEWRECBytes recived : 373
바이트 전송 : 99
바이트가 recevied : 287
바이트 전송 : 나는 물론 더 게시 할 행복하지 않으면, 당신을 위해 충분한 정보의 99
희망을.
문이 헤더
for (int i = 0; i <= recvbuflen; i++){
if (recvbuf[i] == '\n' && (int)recvbuf[i + 1] == -52){
finished = true;
}
}
당신은 * 전체 * 요청을받은 때까지 아무 것도 보내지한다. –
또한 스레드에서 오류가 발생하면 'WSACleanup'을 호출합니다. 물론 메인 스레드를 포함하여 전체 * 프로세스 *를 정리합니다. 그러면 다른 소켓이 아직 열려있는 상태에서 정의되지 않은 동작이 발생할 가능성이 높습니다. –
그리고 마지막으로 쓰레드에서 마지막으로'closesocket'을 수행하기 때문에'shutdown'을 할 필요가 없습니다. 당신이 더 많은 것을 읽을 것이지만 더 보내지 않기를 기대한다면, 송신 측의'shutdown' 만하십시오. –