http 웹서버 구현중 문의 드립니다.
글쓴이: sorate / 작성시간: 월, 2017/07/03 - 4:58오후
간단한 http 웹서버(C++)를 만들어 웹(javascript)과 통신하는 테스트를 해보고 있습니다.
그런데 IE에서는 정상적으로 값을 받는데 크롬에서는 못 받네요.
아래와 같이 실행했습니다.
1. 웹서버 프로그램 실행 (test.exe)
2. 웹 실행(Text.html) 하여 "웹서버 호출" 클릭
3. IE 에서는 정상적으로 값 받지만 크롬에서는 httpRequest.status 값이 0 이 떨어짐.
검색해봐도 도저히 관련 내용은 찾을 수가 없네요.
도대체 원인이 뭘까요?
아래 풀소스와 소스파일 첨부합니다.
-----------------------------
//test.cpp - http 웹서버 소스(C++) #include <stdio.h> #include <winsock2.h> #pragma comment(lib,"WS2_32") int main() { WSADATA wsaData; SOCKET sockSvr; SOCKET sockSS; int nlen; struct sockaddr_in addrSockSvr; struct sockaddr_in addrSockclt; BOOL bValid = 1; char szBuf[2048]; char szInBuf[2048]; // 윈속 초기화 if(WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) { return 1; } // 소켓 만들기 sockSvr = socket(AF_INET, SOCK_STREAM, 0); if(sockSvr == INVALID_SOCKET) { printf("Socket Error No : %d", WSAGetLastError()); return 1; } // 소켓 설정 addrSockSvr.sin_family = AF_INET; addrSockSvr.sin_port = htons(8442); addrSockSvr.sin_addr.S_un.S_addr = INADDR_ANY; // 소켓 옵션 설정 setsockopt(sockSvr, SOL_SOCKET, SO_REUSEADDR, (const char *)&bValid, sizeof(bValid)); if(bind(sockSvr, (struct sockaddr *)&addrSockSvr, sizeof(addrSockSvr)) != 0) { printf("Bind Error No : %d", WSAGetLastError()); return 1; } // TCP클라이언트로 부터 접속 요구를 대기 if(listen(sockSvr, 5) != 0) { printf("Listen Error No : %d", WSAGetLastError()); return 1; } // 응답용 HTTP 메세지 작성 memset(szBuf, 0, sizeof(szBuf)); _snprintf(szBuf, sizeof(szBuf), "HTTP/1.0 200 OK\r\n" "Content-Length: 5\r\n" "Content-Type: text/html\r\n" "\r\n" "test\n"); while(1) { // TCP클라이언트로 부터 접속 요구 받기\tab nlen = sizeof(addrSockclt); sockSS = accept(sockSvr, (struct sockaddr *)&addrSockclt, &nlen); if(sockSS == INVALID_SOCKET) { printf("Accept Error No : %d", WSAGetLastError()); return 1; } memset(szInBuf, 0, sizeof(szInBuf)); recv(sockSS, szInBuf, sizeof(szInBuf), 0); // 클라이언트로 받은 요구 처리 필요(여기서는 생략) printf("%s\n\n", szInBuf); // 클라이언트에 테스트용 HTTP 메세지 송신 send(sockSS, szBuf, (int)strlen(szBuf), 0); closesocket(sockSS); } // 윈속 종료 WSACleanup(); return 0; }
-----------------------------
//Text.html - 웹 소스
<html> <head> <title>HTTP Test</title> <script> function onClick() { var httpRequest=null; if(window.ActiveXObject) //IE { httpRequest = new ActiveXObject("Microsoft.XMLHTTP"); } else if(window.XMLHttpRequest) // Mozilla, Safari, ... { httpRequest = new XMLHttpRequest(); } httpRequest.open('GET', 'http://127.0.0.1:8442/?id=1234', true); httpRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); httpRequest.onreadystatechange = function (aEvt) { if (httpRequest.readyState == 4) { if(httpRequest.status == 200) alert(httpRequest.responseText); else alert(httpRequest.status); } }; httpRequest.send(null); } </script> </head> <a href="#" onclick="javascript:onClick()">웹서버 호출</a> </html>
File attachments:
첨부 | 파일 크기 |
---|---|
http통신.zip | 12.49 KB |
Forums:
서버와 클라이언트가 같은 PC에서 실행되고 있다면
서버와 클라이언트가 같은 PC에서 실행되고 있다면 wireshark를 이용해서 패킷 캡쳐를 해보시는 건 어떤가요?
(구글을 통해 검색해보니 httpRequest.readyState에 여러가지가 있더군요. 혹시 State가 4까지 가지 못하는 경우를 패킷캡쳐를 통해 발견 할 수 있을지도 모르겠다는 생각이 들어 의견을 드립니다.)
감사합니다.
답변주신 부분 한번 살펴보겠습니다.
https://stackoverflow.com
https://stackoverflow.com/questions/4423061/view-http-headers-in-google-chrome
IE는 모르겠지만 크롬과 파이어폭스는 위 링크와 같은 툴을 내장하고 있습니다. 도움이 될 수 있을지도 모르겠습니다.
감사합니다.
말씀 감사합니다. 참고하겠습니다.
댓글 달기