0

我正在尝试创建一个使用 enet 发送一些数据的函数,但首先我想确保此处的示例在mips 系统上正常工作。

我在 Ubuntu 和 Mac 上测试了这个例子,它工作得非常好,但是当我在 mips 系统上测试它时,它总是无法创建主机,而在我测试的其他系统上创建主机时总是没有任何问题。这里有人知道会发生什么吗?有人告诉我这可能是 libenet.so 文件的问题,但由于它与 enet_initialize 函数一起使用,我认为它可能是其他问题。

如果有人想检查,这是我的代码:

#define ENET_IMPLEMENTATION
#include <enet.h>
#include <stdio.h>

int main() {
    if (enet_initialize () != 0) {
        printf("An error occurred while initializing ENet.\n");
        return 1;
    } 
    else {
        printf("Welcome to enet! :D\n");
    }

    //Client side
    ENetHost* client = { 0 };
    client = enet_host_create(NULL /* create a client host */,
                              1 /* only allow 1 outgoing connection */,
                              2 /* allow up 2 channels to be used, 0 and 1 */,
                              0 /* assume any amount of incoming bandwidth */,
                              0 /* assume any amount of outgoing bandwidth */);
    if (client == NULL) {
        fprintf(stderr,
                "An error occurred while trying to create an ENet client host.\n");
        exit(EXIT_FAILURE);
    } 
    else {
        printf("Client created successfully! :D\n");
    }

    enet_host_destroy(server);
    enet_deinitialize();
    return 0; 
}

我的输出是消息:欢迎来到 enet!:D 尝试创建 ENet 客户端主机时发生错误。

4

1 回答 1

0

尝试调试它并进入该enet_host_create函数以查看它失败的地方。看起来该函数的源代码在头文件中。

如果您无法调试和单步调试,您可以临时修改头文件以添加额外的日志记录。

它失败的一些潜在原因:

  • peerCount > ENET_PROTOCOL_MAXIMUM_PEER_ID
  • enet_mallocmalloc 分配内存失败
  • net_socket_create(ENET_SOCKET_TYPE_DATAGRAM) == ENET_SOCKET_NULL

我认为这可能不是问题,peerCount因为默认值ENET_PROTOCOL_MAXIMUM_PEER_ID0xFFF并且您正在通过1.

可能是enet_malloc或的问题net_socket_create。默认情况下enet_malloc只是mallocstdlib 中的常规,我猜这是您正在使用的,因为您没有使用enet_initialize_with_callbacks. enet_socket_create只需调用socket系统调用:

ENetSocket enet_socket_create(ENetSocketType type) {
    return socket(PF_INET6, type == ENET_SOCKET_TYPE_DATAGRAM ? SOCK_DGRAM : SOCK_STREAM, 0);
}

我会确保您的平台mallocsocket实现按预期工作。

于 2021-11-24T20:54:55.897 回答