C ++ - 一个非常简单的HTTP服务器:WSA未引用的错误

时间:2010-05-11 11:21:54

标签: c++ http webserver

我正在学习C ++,我想尝试实现一个只输出文本消息的非常简单的HTTP服务器。我使用Microsoft Visual Studio 2005。

我得到了: 第20行:警告'wsa'未引用的本地变量,而我正在尝试编译我的源代码。我错过了什么吗?

这是我的源代码。

#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;
}

非常感谢。

3 个答案:

答案 0 :(得分:5)

如果出于某种原因,visual studio 2005正在设置NDEBUG,则断言将被预处理并且不会被编译。如果在发布模式下编译通常会发生这种情况。尝试将实际代码移到断言之外,并使用它们来检查返回值。

MSDN Assertions页面提供了有关VS中断言的更多信息。

答案 1 :(得分:1)

assert是一个条件宏,在Microsoft Libraries中定义如下:

#ifdef NDEBUG
#define assert(_Expression)     ((void)0)   // assert (something); becomes 0; if NDEBUG is not defined!
#else
... code to show an error
#endif

因此,当未定义NDEBUG时,您放入断言的所有代码都不会出现。

NDEBUG的目的是进行检查,这些检查仅在调试模式下运行,而不是用于检查错误。

您编写的代码将在Visual Studio中的调试版本中编译和运行,但在版本构建中将失败。

答案 2 :(得分:0)

一旦我删除了getaddrinfo(),代码就会为我编译,但这不是你的问题。此外,你严重滥用assert() - 它不应该是一个通用的错误处理方案。