Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;-一个非常简单的HTTP服务器:WSA未引用错误 我正在学习C++,我想尝试实现一个非常简单的HTTP服务器,它只会输出一条文本消息。我使用MicrosoftVisualStudio2005_C++_Http_Webserver - Fatal编程技术网

C++;-一个非常简单的HTTP服务器:WSA未引用错误 我正在学习C++,我想尝试实现一个非常简单的HTTP服务器,它只会输出一条文本消息。我使用MicrosoftVisualStudio2005

C++;-一个非常简单的HTTP服务器:WSA未引用错误 我正在学习C++,我想尝试实现一个非常简单的HTTP服务器,它只会输出一条文本消息。我使用MicrosoftVisualStudio2005,c++,http,webserver,C++,Http,Webserver,我得到: 第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/htm

我得到: 第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;
}
#包括
#包括
#包括
#包括
const char html[]=“HTTP/1.1 200正常\r\n”
“连接:关闭\r\n”
“内容类型:text/html\r\n”
“\r\n”
“\r\n”
“\r\n”
你好,世界!\r\n
“\r\n”
“\r\n”
你好,世界!\r\n
“\r\n”
“\r\n\r\n”;
int main(){
WSADATA wsa;
断言(WSAStartup(MAKEWORD(2,2),&wsa)==0);
addrinfo*res=NULL;
addrinfo提示;
零内存(&提示,sizeof(提示));
hits.ai_family=AF_INET;
hits.ai_socktype=SOCK_流;
hits.ai_protocol=IPPROTO_TCP;
hits.ai_flags=ai_被动;
断言(getaddrinfo(NULL,“80”、&hints、&res)==0);
sockets=SOCKET(res->ai_系列,res->ai_socktype,res->ai_协议);
断言(s!=无效的_套接字);
断言(绑定(s,res->ai_addr,(int)res->ai_addrlen)!=套接字错误);
断言(侦听(s,SOMAXCONN)!=SOCKET\u错误);
套接字客户端=接受(s,NULL,NULL);
断言(客户端!=无效的_套接字);
字符缓冲区[512];
整数字节;
字节=recv(客户端,缓冲区,512,0);
对于(int i=0;i

非常感谢。

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


页面提供了有关assert in VS.

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


page提供了有关assert in VS.的更多信息。

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

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

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的调试版本中编译和运行,但在发布版本中会失败。

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的调试版本中编译和运行,但在发布版本中会失败。

它应该在两个版本中编译,就像他在断言中所做的一切是调用函数一样。但是,发布版本在运行时显然不会做任何有用的事情。它应该在两个版本中编译,就像他在断言中所做的一切是调用函数一样但是,发布版本在运行时显然不会做任何有用的事情。