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:
| 첨부 | 파일 크기 |
|---|---|
| 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는 모르겠지만 크롬과 파이어폭스는 위 링크와 같은 툴을 내장하고 있습니다. 도움이 될 수 있을지도 모르겠습니다.
감사합니다.
말씀 감사합니다. 참고하겠습니다.
댓글 달기