0

我正在尝试在 c++ usind SDL 中检索 websice 的内容,但它给了我这个错误:

'SDL_main' : 必须返回一个值

我的代码是:

#include <iostream>
#include "SDL.h"
#include "SDL_net.h"
#include <cstring>

int main(int argc,char** argv)
{
    SDL_Init(SDL_INIT_EVERYTHING);
    SDLNet_Init();

    IPaddress ip;
    SDLNet_ResolveHost(&ip,"www.linux.org",80);

    const char* http="GET / HTTP/1.1\nHost: www.linux.org\n\n";

    TCPsocket client=SDLNet_TCP_Open(&ip);

    SDLNet_TCP_Send(client,http,strlen(http)+1);

    char text[10000];

    while(SDLNet_TCP_Recv(client,text,10000))
        std::cout << text;

    SDLNet_TCP_Close(client);

    SDLNet_Quit();
    SDL_Quit();
}

当我把 return 0; 最后,它构建了项目,但之后立即完成(我使用的是 vs2012)

更新

cout<<"Some message";

不打印任何东西,是否有可能我的导入配置错误?这些额外的依赖关系对吗?

SDL.lib;SDL_net.lib;SDLmain.lib

我不知道还有什么问题...

4

2 回答 2

6

这是因为 SDL 定义了这样的宏:

#define main SDL_main

所以你写的函数实际上是被调用的SDL_main,就像任何其他不是实际main函数的函数一样,如果它不返回void,你必须给它一个return声明。

于 2013-03-26T18:42:13.303 回答
0

因为您的代码不会永远循环,它只会在第一次通过后返回 0,所以您需要进行如下循环:

while(1){
sdl_events event;    

switch(event){
//handle events, drawings and so on
...
...
...
case SDL_QUIT:
 exit (0);
 break;
}

}

http://sdl.beuc.net/sdl.wiki/OpenGL_Full_Example

更新
您在连接到主机时可能还会遇到一些问题,因此您可以像这样检查连接是否成功:

#define MAXLEN 1024
int result;
char msg[MAXLEN];

result = SDLNet_TCP_Recv(sock,msg,MAXLEN-1);
if(result <= 0) {
    // TCP Connection is broken. (because of error or closure)
    SDLNet_TCP_Close(sock);
    exit(1);
}
else {
    msg[result] = 0;
    printf("Received: \"%s\"\n",msg);
}

更新2
改变了这一点:

while(SDLNet_TCP_Recv(client,text,10000))
        std::cout << text;  

对此:

while(SDLNet_TCP_Recv(client,text,9999))
        std::cout << text;

更新 3
试试这个,把你的接收部分放在这个 if 语句中

if(SDLNet_SocketReady(client) == 1)
{
  while(SDLNet_TCP_Recv(client,text,9999))
       std::cout << text;
}

如果这仍然不起作用,我建议使用 QT 套接字或 Boost asio,既异步又更直观

于 2013-03-26T19:02:31.067 回答