现在,我只是在玩这个,我不确定为什么这不起作用。
#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 时,我在控制台中得到了这个:
获取/HTTP/1.1
主机:127.0.0.1
连接:保持活动
用户代理:Mozilla/5.0(Windows;U;Windows NT 5.1;en-US)AppleWebKit/530.5(K HTML,如 Gecko)Chrome/2.0.172.8 Safari/530.5
缓存控制:max-age=0
接受:application/xml,application/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 - 所以似乎它在 Firefox 上工作的原因,而不是 Chrome,是因为 Firefox 将 HTML 显示为收到的,而 Chrome 在进行任何渲染之前等待连接关闭。我添加了关闭套接字的代码并且它起作用了。我已经用工作源更新了我的代码。