Estoy intentando compilar este programa, como se indica en la Guía del Beej a la red Programación en la página 19.netdb.h no vinculan adecuadamente
#include <stdio.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
int main() {
int status;
struct addrinfo hints;
struct addrinfo *servinfo; /* Will point to the results */
memset(&hints, 0, sizeof hints); /* Make sure the struct is empty */
hints.ai_family = AF_UNSPEC; /* Don't care IPv4 or IPv6 */
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
if ((status = getaddrinfo(NULL, "3490", &hints, &servinfo)) != 0) {
fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status));
exit(1);
}
/* Servinfo now points to a linked list of 1 or more struct addrinfos
... do everything until you don't need servinfo anymore .... */
freeaddrinfo(servinfo); /* Free the linked-list */
return 0;
}
Entre otros errores, veo
../main.c:8:18: error: storage size of ‘hints’ isn’t known
../main.c:13:19: error: ‘AI_PASSIVE’ undeclared (first use in this function)
../main.c:16:3: warning: implicit declaration of function ‘gai_strerror’
Parece que gcc no está enlazando con netdb.h
. Eclipse, el IDE que estoy usando para compilar esto, no tiene problemas para encontrar el archivo. Aquí está el comando del compilador:
gcc -O0 -g3 -pedantic -Wall -c -fmessage-length=0 -ansi -MMD -MP -MF"main.d" -MT"main.d" -o"main.o" "../main.c"
Adición -lnetdb
no resuelve el problema. Además ...
~> find /usr/include/ -name netdb.h
/usr/include/bits/netdb.h
/usr/include/gssrpc/netdb.h
/usr/include/netdb.h
/usr/include/rpc/netdb.h
Creo que estos archivos vienen preinstalados en mi host de openSUSE. ¿Por qué no detecta gcc netdb.h
? ¿O estoy sacando la conclusión equivocada?
Obtengo los mismos tres archivos de encabezado como salida. Veo estos errores de compilación: http://pastebin.com/jVVMqftA – Pieter
Entonces ... ¿está funcionando? Es decir, no está viendo ningún error relacionado con 'netdb.h', y ¿está recibiendo una advertencia sobre' memset() '? Eso suena como progreso. La advertencia 'memset()' significa que necesita '#include' (esto viene de la página de comando man' memset (3) '). –
larsks
No veo ninguna advertencia o error si incluyo 'string.h' también. Sin embargo, quiero que mi código sea compatible con ANSI C, así que sigo recibiendo estos errores ... http://pastebin.com/B21NyGQ9 – Pieter