2010-05-11 6 views
0

J'apprends le C++, je voulais essayer d'implémenter un serveur HTTP très simple qui va juste sortir un message texte. J'utilise Microsoft Visual Studio 2005.C++ - Un serveur HTTP très simple: WSA erreur non référencée

Je reçois: Ligne 20: Avertissement 'WSA' variable locale non référencée, alors que je suis en train de compiler mon code source. Est-ce que je manque quelque chose?

Voici mon code source.

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

Merci beaucoup.

Répondre

5

Si, pour une raison quelconque, Visual Studio 2005 définit NDEBUG, les assertions seront pré-traitées et ne seront pas compilées. Cela arrive généralement si vous compilez en mode release. Essayez de déplacer le code en dehors des assertions et utilisez-les simplement pour vérifier les valeurs de retour.

MSDN Assertions La page contient plus d'informations sur assert dans VS.

0

Le code compile pour moi une fois que je supprime getaddrinfo(), mais ce n'est pas votre problème. En outre, vous utilisez abusivement assert() - ce n'est pas supposé être un schéma de gestion des erreurs à usage général.

1

assert est une macro conditionnelle, qui est défini quelque chose comme ceci dans des bibliothèques Microsoft:

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

Donc tout le code que vous avez mis Affirme l'intérieur ne sera pas présent lorsque NDEBUG n'est pas défini. Le but de NDEBUG est d'effectuer des vérifications qui ne seront exécutées qu'en mode débogage et non pour vérifier les erreurs.

Le code que vous avez écrit sera compilé et exécuté dans la version de débogage dans Visual Studio, mais échouera dans les versions de version.

+0

Il devrait compiler dans les deux versions, car tout ce qu'il fait dans les asserts est des fonctions d'appel. La version Release ne fera évidemment rien d'utile lors de l'exécution, cependant. –