我正在使用SDL编写一个用C语言编写的游戏。鉴于它已经使用了SDL,SDL_image和SDL_ttf,我决定将SDL_mixer和SDL_net添加到我的引擎中。让SDL_mixer设置和工作非常简单,但我在使用SDL_net时遇到了很多麻烦。
为了测试我使用以下规则创建了一个非常简单的应用程序:
以下是该计划的一些关键部分(我不会发布我的整个事件驱动的SDL引擎,因为它太长了):
char *host = NULL;
if (argc > 1) host = argv[1];
和...
IPaddress ip;
TCPsocket server = NULL;
TCPsocket conn = NULL;
if (host) { /* client mode */
if (SDLNet_ResolveHost(&ip,host,port) < 0)
return NULL; //this is actually inside an engine method
if (!(conn = SDLNet_TCP_Open(&ip)))
return NULL;
} else { /* server mode */
if (SDLNet_ResolveHost(&ip,NULL,port) < 0)
return NULL;
if (!(server = SDLNet_TCP_Open(&ip)))
return NULL;
}
和...在事件循环中
if (server) {
if (!conn)
conn = SDLNet_TCP_Accept(server);
}
if (conn) {
void *buf = malloc(size); //server, conn, size are actually members of a weird struct
while (SDLNet_TCP_Recv(conn,buf,size))
onReceive(buf); //my engine uses a callback system to handle things
free(buf);
}
程序似乎启动得很好。但是出于某种原因,当我在客户端模式下运行它试图从我的笔记本电脑连接到我的家用电脑(我有一个不同的IP)时,我发现对SDLNet_TCP_Open的调用会阻止程序一段时间(5-10秒)然后返回空值。谁能看到我做错了什么?我应该发布更多的代码吗?让我知道。