2010-05-11 21 views
0

我正在學習C++,我想嘗試實現一個非常簡單的HTTP服務器,它將只輸出一條文本消息。我使用Microsoft Visual Studio 2005.C++ - 一個非常簡單的HTTP服務器:WSA未引用的錯誤

我得到了: 行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; 
} 

非常感謝。

回答

5

如果由於某種原因visual studio 2005設置NDEBUG,斷言將被預處理出來,不會被編譯。這通常發生在編譯模式下。嘗試移動斷言之外的實際代碼,並使用它們來檢查返回值。

MSDN Assertions頁面有關於在VS中斷言的更多信息。

0

代碼爲我編譯,一旦我刪除getaddrinfo(),但那不是你的問題。此外,你嚴重濫用assert() - 它不應該是一個通用的錯誤處理方案。

1

斷言是一個條件宏,這是在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

它應該在兩個版本中編譯,因爲他在斷言中所做的全部都是調用函數。然而,發佈版本在運行時顯然不會有用。 – 2010-05-11 11:39:30