如何在getaddrinfo中处理这个指针?

时间:2010-08-16 03:36:59

标签: c sockets

警告:请像我这样的菜鸟一样对待我。这是我的第一个“真正的”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 个答案:

答案 0 :(得分:6)

该行:

Server *server;

实际上并没有为服务器结构分配任何空间,仅用于指向一个服务器结构的指针,该指针设置为随机值。

看起来你需要的改变是:

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

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

考虑以下差异:

Server *server;              |  Server *server = malloc (sizeof (Server));
       +----------+          |         +---------+     +-----------+
server | ???????? | --> ???  |  server | pointer | --> | structure |
       +----------+          |         +---------+     +-----------+

答案 1 :(得分:2)

int main(int argc, char** argv) {
// Set up socket stuff
Server *server; // Set up the server
memset(server, 0, sizeof(Server));

这是不正确的。在这里,您要求memsetserver指向的内存清零。对memset的调用是正确的,它是指针server不是。这一行:

Server *server;

为内存分配并为您提供指针,但它不会为指向对象分配任何内存,也不会为指针指定初始值。因此,在此行之后,指针只指向内存中的某个随机点。 (它正在使用RAM中遗留的任何内容,可能)我们尚未为其分配有效值,因此将其传递给memset无效。

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

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

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

2)使用Server

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

(另请注意,sizeof的使用 - 如果您更改变量的类型,则使用变量名而不是类型将允许sizeof进行调整。)

您可能希望查找并查看有关指针的基本教程。这是一个非常经典的错误,一个人第一次装入指针,所以,不要觉得太糟糕。