2010-08-29 6 views
0

Je l'ai eu fonctionnait précédemment, mais je n'ai pas compris comment, alors j'essaye de réécrire un peu de code.Obtenir ai_socktype non pris en charge

Tout semble aller bien, sauf quand j'essaie d'utiliser getaddrinfo(), je récupère un résultat de -7, ce qui se traduit par l'erreur "ai_socktype non supporté".

Je suis prêt à parier que c'est simplement moi qui maîtrise les pointeurs. Si quelqu'un peut expliquer comment/où je me trompe, j'apprécierais.

Le code:

#define PORT "4400" 
typedef struct { 
    int port; 
    fd_set *connections; 
    int connections_count; 
    int listener; 
    struct addrinfo *address; 
    struct addrinfo *socket_hints; 
} Server; 

void initialize_server(Server *passed_server, char *port) { 
    struct addrinfo *temp; 
    int status; // Get addrinfo status 

    // Set up the server hints 
    passed_server->socket_hints = malloc(sizeof passed_server->socket_hints); 
    passed_server->socket_hints->ai_family = AF_UNSPEC; 
    passed_server->socket_hints->ai_socktype = SOCK_STREAM; 
    passed_server->socket_hints->ai_flags = AI_PASSIVE; 

    if((status = getaddrinfo(NULL, port, passed_server->socket_hints, &temp)) != 0) { 
     fprintf(stderr, "Error with getaddrinfo: %s\n", gai_strerror(status)); 
    } 
    printf("Result: %d\n", status); 
} 

int main(int argc, char** argv) { 
    // Set up socket stuff 
    Server *server = malloc(sizeof *server); // Set up the server 
    initialize_server(server, PORT); 

    return (EXIT_SUCCESS); 
} 

Répondre

1

Après retourner dans le code, je me suis aperçu que je devais changer:

passed_server->socket_hints = malloc(sizeof passed_server->socket_hints); 

à

passed_server->socket_hints = malloc(sizeof *passed_server->socket_hints); 

Je crois qu'il est parce que, dans la première J'obtiens la taille d'un emplacement de mémoire (type int). Dans la seconde, je renvoie la taille de la structure à laquelle socket_hints pointe.

+4

Pourquoi avez-vous 'malloc()' les indices du tout? Utilisez juste un local de type 'struct addrinfo' et prenez l'adresse de celui-ci quand vous le passez à' getaddrinfo() '. Aussi, vous voulez probablement faire quelque chose comme 'memset (& hints, 0, sizeof (hints))' pour vous assurer que tous les autres champs ont été mis à zéro. –

+0

Je changeais juste ça, en fait. J'ai réalisé que je n'avais pas besoin de les faire pointer car il n'y a aucune raison de le faire en premier lieu. Et fera pour l'indice memset. – Codeacula

Questions connexes