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의 이미지

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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.