代码之家  ›  专栏  ›  技术社区  ›  Codeacula

如何在getaddrinfo中处理此指针?

  •  8
  • Codeacula  · 技术社区  · 16 年前

    警告:请像对待新手一样对待我。这是我的第一个“真正的”C程序。所以如果我不明白一些事情,那就是原因。

    我正试图按照Beej的网络编程指南中的示例制作一个聊天服务器。它是推荐的,所以你去吧。

    我想让一个函数接受一个指向结构的指针,修改该指针中的属性,并在传递的端口上设置一个侦听器。在下面的代码中,我遇到了一个分段错误,我真的不知道为什么。怪我是绿色的。(如果需要,在Ubuntu的NetBeans 6.8中开发):

    #define PORT "4400"
    
    typedef struct {
        int port;
        fd_set *connections;
        int connections_count;
        int listener;
        struct addrinfo address;
        struct addrinfo socket_hints;
    } Server;
    
    typedef struct {
        struct sockaddr_storage address;    // User's address
        int fs_id;                  // ID to the socket they belong to
        char *name;                 // Pointer to the user's name
        struct User *nextUser;      // Next user in the list
    } User;
    
    void initialize_server(Server *passed_server, char *port) {
        struct addrinfo *temp;
        int result;
    
        // Set up the server hints
        memset(&passed_server->socket_hints, 0, sizeof(struct addrinfo));
        passed_server->socket_hints.ai_family = AF_UNSPEC;
        passed_server->socket_hints.ai_socktype = SOCK_STREAM;
        passed_server->socket_hints.ai_flags = AI_PASSIVE;
    
        result = getaddrinfo(NULL, port, &passed_server->socket_hints, &temp);
        printf("Result: %d\n", result);
    }
    
    int main(int argc, char** argv) {
        // Set up socket stuff
        Server *server; // Set up the server
        memset(server, 0, sizeof(Server));
    
        fd_set read_sockets; // Master socket holder and sockets to read
        int new_connection; // Holds the socket ID of the new connection
        socklen_t address_length; // Used to hold the length of the address from the user
        struct addrinfo;
    
        // Useful sets
        char buffer[1024];
        int bytes_recieved;
        int yes = 1; // For SETOPT
    
        // Set up server info on defined port
        initialize_server(server, PORT);
        FD_ZERO(&read_sockets);
    
        return (EXIT_SUCCESS);
    }
    

    如果您需要完整的代码(我认为我发布了所有必要的内容),您可以在下面找到一个链接。提前感谢您的帮助或尝试!

    http://pastebin.org/529545

    2 回复  |  直到 13 年前
        1
  •  6
  •   paxdiablo    16 年前

    线:

    Server *server;
    

    实际上并没有为服务器结构分配任何空间,只是为设置为随机值的指向服务器结构的指针分配空间。

    您需要的更改如下:

    Server *server = malloc (sizeof (Server));
    

    它实际上为您分配了一些内存。

    区别如下:

    Server *server;              |  Server *server = malloc (sizeof (Server));
           +----------+          |         +---------+     +-----------+
    server | ???????? | --> ???  |  server | pointer | --> | structure |
           +----------+          |         +---------+     +-----------+
    
        2
  •  2
  •   Thanatos    16 年前
    int main(int argc, char** argv) {
    // Set up socket stuff
    Server *server; // Set up the server
    memset(server, 0, sizeof(Server));
    

    这是不正确的。这里,你在问 memset 将指向的内存归零 server . 呼唤 清零 是正确的,是指针 服务器 不是。这条线:

    Server *server;
    

    为分配内存并给您一个指针,但它不为指向对象分配任何内存,也不给指针一个初始值。因此,在这行之后,指针只是指向内存中的某个随机点。(可能是在使用RAM中剩余的内容)我们还没有为其分配有效值,因此将其传递给 清零 .

    现在,我们需要给它一个有效值。你可以:

    1)分配一个 Server 在堆栈上,只需说:

    Server server;
    memset(&server, 0, sizeof(server));
    

    2)分配一个 服务器 动态,使用 malloc :

    Server *server = malloc(sizeof(*server));
    // Check for NULL, which means malloc failed.
    

    (同时,注意 sizeof -使用变量名而不是类型将允许 西泽 如果更改变量类型,则进行调整。)

    您可能希望找到并回顾关于指针的基本教程。这是一个很典型的错误,因为有人第一次遇到指针,所以不要觉得太糟糕。

    推荐文章