C ++ - Очень простой HTTP-сервер: WSA-ссылка без ошибок - PullRequest
0 голосов
/ 11 мая 2010

Я изучаю 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 ]

5 голосов
/ 11 мая 2010

Если по какой-то причине Visual Studio 2005 устанавливает NDEBUG, утверждения будут предварительно обработаны и не будут скомпилированы. Обычно это происходит при компиляции в режиме релиза. Попробуйте переместить действительный код за пределы утверждений и просто использовать их для проверки возвращаемых значений.

Утверждения MSDN * Страница 1004 * содержит больше информации об утверждении в VS.

1 голос
/ 11 мая 2010

assert - это условный макрос, который определяется примерно так в библиотеках Microsoft:

#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, но не будет работать в сборках выпуска.

0 голосов
/ 11 мая 2010

Код компилируется для меня, как только я удаляю getaddrinfo (), но это не ваша проблема. Кроме того, вы серьезно используете assert () - это не должна быть схема обработки ошибок общего назначения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...