http 웹서버 구현중 문의 드립니다.

sorate의 이미지

간단한 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: 
첨부파일 크기
Package icon http통신.zip12.49 KB
m4170의 이미지

서버와 클라이언트가 같은 PC에서 실행되고 있다면 wireshark를 이용해서 패킷 캡쳐를 해보시는 건 어떤가요?
(구글을 통해 검색해보니 httpRequest.readyState에 여러가지가 있더군요. 혹시 State가 4까지 가지 못하는 경우를 패킷캡쳐를 통해 발견 할 수 있을지도 모르겠다는 생각이 들어 의견을 드립니다.)

sorate의 이미지

답변주신 부분 한번 살펴보겠습니다.

...!의 이미지

https://stackoverflow.com/questions/4423061/view-http-headers-in-google-chrome

IE는 모르겠지만 크롬과 파이어폭스는 위 링크와 같은 툴을 내장하고 있습니다. 도움이 될 수 있을지도 모르겠습니다.

sorate의 이미지

말씀 감사합니다. 참고하겠습니다.