现在,我只是闹着玩这个,我不知道为什么这不是工作。

#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

连接:保活

User-Agent:Mozilla/5.0(窗口;U;Windows NT5.1;en-US)AppleWebKit/530.5(K HTML,像只壁虎)铬/2.0.172.8Safari/530.5

Cache-Control:最大年龄=0

接受:应用/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,/;q=0.5

Accept-Encoding:gzip,放气,bzip2,sdch

接受语言:en-US,en;q=0.8

接受-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3

编辑 -我已经更新了HTML我发送。我只是测试这与火狐和谷歌铬和它的工作原理在火狐,但不铬!

编辑2 -这样看来,原因是工作上的火狐,但不是镀铬,是因为火狐显示HTML作为其接收的,而铬等待接到靠近以前做的任何呈现。我加入代码接近的窝和它的工作。我已经更新我的代码的工作来源。

有帮助吗?

解决方案

您需要发送回状态行:

HTTP / 1.1 200 OK

前述的响应报头。

请参阅提琴手(www.fiddler2.com)得到一个什么样正确的HTTP响应看起来像一个更好的主意。

关于你的后编辑,所有浏览器等待一定量的数据的开始呈现之前; Chrome浏览器的限制比Firefox的不同。如果设置了一个内容长度的或用过的HTTP分块编码,你会看到正确的行为。

其他提示

看看猫鼬 http://code.google.com/p/mongoose/ 这是一个自给自足的图书馆,这是一个多线程http网服务器并有一个超级简单api(未完成)。在几分钟之内我就能够结合到我已经在现有的应用程序。

我有同样的问题今天早些时候(给我的C++应用程序的网端) 给C++应用程序HTTP网服务器的功能

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top