문제

자, 나는 단지 이것을 속이고 있으며 이것이 왜 작동하지 않는지 확실하지 않습니다.

#include <winsock2.h>
#include <ws2tcpip.h>
#include <iostream>
#include <cassert>

const char html[] = "HTTP/1.1 200 OK\r\n"
"Connection: close\r\n"
"Content-type: text/html\r\n"
"\r\n"
"<html>\r\n"
"<head>\r\n"
"<title>Hello, world!</title>\r\n"
"</head>\r\n"
"<body>\r\n"
"<h1>Hello, world!</h1>\r\n"
"</body>\r\n"
"</html>\r\n\r\n";

int main() {
    WSADATA wsa;

    assert( WSAStartup( MAKEWORD( 2, 2 ), &wsa ) == 0 );

    addrinfo *res = NULL;
    addrinfo hints;

    ZeroMemory( &hints, sizeof( hints ) );

    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    hints.ai_flags = AI_PASSIVE;

    assert( getaddrinfo( NULL, "80", &hints, &res ) == 0 );

    SOCKET s = socket( res->ai_family, res->ai_socktype, res->ai_protocol );

    assert( s != INVALID_SOCKET );
    assert( bind( s, res->ai_addr, (int)res->ai_addrlen ) != SOCKET_ERROR );
    assert( listen( s, SOMAXCONN ) != SOCKET_ERROR );

    SOCKET client = accept( s, NULL, NULL );

    assert( client != INVALID_SOCKET );

    char buffer[512];
    int bytes;

    bytes = recv( client, buffer, 512, 0 );

    for ( int i = 0; i < bytes; ++i ) {
        std::cout << buffer[i];
    }

    assert( send( client, html, strlen( html ) - 1, 0 ) > 0 );
    assert( shutdown( client, SD_BOTH ) != SOCKET_ERROR );

    closesocket( client );
    WSACleanup();

    return 0;
}

이것을 컴파일하고 실행 한 다음 내 브라우저에서 127.0.0.1로 이동하면 콘솔에서 이것을 얻습니다.

get / http / 1.1

호스트 : 127.0.0.1

연결 : 계속하십시오

사용자 에이전트 : Mozilla/5.0 (Windows; U; Windows NT 5.1; EN-US) AppleWebkit/530.5 (K HTML, Gecko와 같은 K HTML) Chrome/2.0.172.8 Safari/530.5

캐시 제어 : MAX-AGE = 0

수락 : 응용 프로그램/xml, 응용 프로그램/xhtml+xml, text/html; q = 0.9, text/plain; q = 0.8, image/png,/; q = 0.5

인코딩 수락 : Gzip, deflate, bzip2, sdch

수용 언어 : en-us, en; q = 0.8

수락-문자 : ISO-8859-1, UTF-8; Q = 0.7,*; Q = 0.3

편집하다 - 내가 보내는 HTML을 업데이트했습니다. 방금 Mozilla Firefox와 Google Chrome으로 이것을 테스트했으며 Firefox에서 작동하지만 Chrome은 아닙니다!

편집 2 - Chrome이 아닌 Firefox에서 작동하는 이유는 Firefox가 HTML을 수신 한대로 표시하기 때문에 Chrome은 렌더링을 수행하기 전에 연결을 닫을 때까지 기다립니다. 소켓을 닫기 위해 코드를 추가하여 작동했습니다. 작업 소스로 코드를 업데이트했습니다.

도움이 되었습니까?

해결책

상태 라인을 다시 보내야합니다.

HTTP/1.1 200 OK

응답 헤더 이전.

적절한 HTTP 응답이 어떤 모습인지에 대한 더 나은 아이디어를 얻으려면 Fiddler (www.fiddler2.com)를 참조하십시오.

나중에 편집과 관련하여 모든 브라우저는 렌더링을 시작하기 전에 일정량의 데이터를 기다립니다. 크롬의 한계는 Firefox와 다릅니다. 컨텐츠 길이 또는 중고 HTTP 청크 인코딩을 설정 한 경우 적절한 동작을 보았을 것입니다.

다른 팁

몽구스를보세요 http://code.google.com/p/mongoose/멀티 스레드 HTTP 웹 서버이며 매우 간단한 API가있는 자체 포함 된 라이브러리입니다. 몇 분 안에 이미 기존 앱에 묶을 수있었습니다.

나는 오늘 일찍 같은 질문을했다 (내 C ++ 응용 프로그램을 웹 엔드에 제공하기 위해) C ++ 응용 프로그램에 HTTP 웹 서버 기능을 제공합니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top