int sockconnect(struct addrinfo *res,char *host,in_port_t *uport,FILE *fp){ struct addrinfo *cai; int s = -1; cai = res; while(cai != NULL){ getipaddrstr(cai,host,uport,STRSIZE); printf("Connect \n"); printaddrinfo(cai,host,NULL,NULL,fp); s = socket(cai->ai_family,cai->ai_socktype,cai->ai_protocol); if(s == -1){ perror("socket create failed"); return -1; } if(connect(s,cai->ai_addr,cai->ai_addrlen)==-1) { perror("Connect Fail"); close(s); s = -1; cai = cai -> ai_next; continue; }else{ return s; } } fprintf(stderr,"No more addrinfo to connect to\n"); return -1; }
int main(int argc, char **argv) { struct my_addrinfo *res = NULL, hints; int gaie; (void)argc; (void)argv; memset(&hints, 0x00, sizeof(struct my_addrinfo)); hints.ai_family = AF_INET; #ifdef _WIN32 { #ifdef USE_WINSOCK2 const WORD VerNeed = MAKEWORD(2,2); #else const WORD VerNeed = MAKEWORD(1,1); #endif WSADATA WSAData; WSAStartup(VerNeed, &WSAData); } #endif printf("-----------------------------------------------------------\n"); #ifndef _WIN32 //NULL as res crashes Win32 gaie = I_getaddrinfo(NULL, NULL, &hints, NULL); if (gaie != EAI_NONAME) printf("NULLs test returned: %s(%d)\n", gai_strerror(gaie), gaie); I_freeaddrinfo(res); #endif #if 0 //NULL as res crashes gaie = I_getaddrinfo("localhost", "5029", NULL, NULL); if (gaie == 0) printf("NULL crashes: %s(%d)\n", gai_strerror(gaie), gaie); I_freeaddrinfo(res); #endif gaie = I_getaddrinfo("localhost", NULL, &hints, &res); //if (gaie != 0) printf("NULL service test returned: %s(%d)\n", gai_strerror(gaie), gaie); printaddrinfo(res); I_freeaddrinfo(res); res = NULL; gaie = I_getaddrinfo(NULL, "5029", &hints, &res); //if (gaie != 0) printf("NULLs test returned: %s(%d)\n", gai_strerror(gaie), gaie); printaddrinfo(res); I_freeaddrinfo(res); res = NULL; gaie = I_getaddrinfo("localhost", "5029", &hints, &res); //if (gaie != 0) printf("no hints test returned: %s(%d)\n", gai_strerror(gaie), gaie); printaddrinfo(res); I_freeaddrinfo(res); res = NULL; printf("-----------------------------------------------------------\n"); hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; gaie = I_getaddrinfo("localhost", NULL, &hints, &res); //if (gaie != 0) printf("NULL service test returned: %s(%d)\n", gai_strerror(gaie), gaie); printaddrinfo(res); I_freeaddrinfo(res); res = NULL; gaie = I_getaddrinfo(NULL, "5029", &hints, &res); //if (gaie != 0) printf("NULLs test returned: %s(%d)\n", gai_strerror(gaie), gaie); printaddrinfo(res); I_freeaddrinfo(res); res = NULL; gaie = I_getaddrinfo("localhost", "5029", &hints, &res); //if (gaie != 0) printf("no hints test returned: %s(%d)\n", gai_strerror(gaie), gaie); printaddrinfo(res); I_freeaddrinfo(res); res = NULL; printf("-----------------------------------------------------------\n"); hints.ai_socktype = SOCK_DGRAM; hints.ai_protocol = IPPROTO_UDP; gaie = I_getaddrinfo("localhost", NULL, &hints, &res); //if (gaie != 0) printf("NULL service test returned: %s(%d)\n", gai_strerror(gaie), gaie); printaddrinfo(res); I_freeaddrinfo(res); res = NULL; gaie = I_getaddrinfo(NULL, "5029", &hints, &res); //if (gaie != 0) printf("NULLs test returned: %s(%d)\n", gai_strerror(gaie), gaie); printaddrinfo(res); I_freeaddrinfo(res); res = NULL; gaie = I_getaddrinfo("localhost", "5029", &hints, &res); //if (gaie != 0) printf("no hints test returned: %s(%d)\n", gai_strerror(gaie), gaie); printaddrinfo(res); I_freeaddrinfo(res); res = NULL; printf("-----------------------------------------------------------\n"); hints.ai_flags = AI_NUMERICHOST; gaie = I_getaddrinfo("localhost", NULL, &hints, &res); //if (gaie != 0) printf("NULL service test returned: %s(%d)\n", gai_strerror(gaie), gaie); printaddrinfo(res); I_freeaddrinfo(res); res = NULL; gaie = I_getaddrinfo(NULL, "5029", &hints, &res); //if (gaie != 0) printf("NULLs test returned: %s(%d)\n", gai_strerror(gaie), gaie); printaddrinfo(res); I_freeaddrinfo(res); res = NULL; gaie = I_getaddrinfo("localhost", "5029", &hints, &res); //if (gaie != 0) printf("no hints test returned: %s(%d)\n", gai_strerror(gaie), gaie); printaddrinfo(res); I_freeaddrinfo(res); res = NULL; printf("-----------------------------------------------------------\n"); gaie = I_getaddrinfo("127.0.0.1", NULL, &hints, &res); //if (gaie != 0) printf("NULL service test returned: %s(%d)\n", gai_strerror(gaie), gaie); printaddrinfo(res); I_freeaddrinfo(res); res = NULL; gaie = I_getaddrinfo("127.0.0.1", "5029", &hints, &res); //if (gaie != 0) printf("no hints test returned: %s(%d)\n", gai_strerror(gaie), gaie); printaddrinfo(res); I_freeaddrinfo(res); res = NULL; printf("-----------------------------------------------------------\n"); gaie = I_getaddrinfo("255.255.255.255", NULL, &hints, &res); //if (gaie != 0) printf("NULL service test returned: %s(%d)\n", gai_strerror(gaie), gaie); printaddrinfo(res); I_freeaddrinfo(res); res = NULL; gaie = I_getaddrinfo("255.255.255.255", "5029", &hints, &res); //if (gaie != 0) printf("no hints test returned: %s(%d)\n", gai_strerror(gaie), gaie); printaddrinfo(res); I_freeaddrinfo(res); res = NULL; printf("-----------------------------------------------------------\n"); hints.ai_flags = AI_PASSIVE; gaie = I_getaddrinfo("0.0.0.0", NULL, &hints, &res); //if (gaie != 0) printf("NULL service test returned: %s(%d)\n", gai_strerror(gaie), gaie); printaddrinfo(res); I_freeaddrinfo(res); res = NULL; gaie = I_getaddrinfo("0.0.0.0", "5029", &hints, &res); //if (gaie != 0) printf("no hints test returned: %s(%d)\n", gai_strerror(gaie), gaie); printaddrinfo(res); I_freeaddrinfo(res); res = NULL; return 0; }
int main(int argc, char **argv) { static const struct addrinfo zero_addrinfo; struct addrinfo hints = zero_addrinfo; struct addrinfo *addrinfo; const char *hostname = NULL, *service = NULL; int ch; int error; setprogname(argv[0]); hints.ai_family = AF_UNSPEC; hints.ai_socktype = 0; hints.ai_protocol = 0; hints.ai_flags = 0; while ((ch = getopt(argc, argv, "cf:nNp:Ps:t:")) != -1) { switch (ch) { case 'c': hints.ai_flags |= AI_CANONNAME; break; case 'f': if (!parse_af(optarg, &hints.ai_family)) { warnx("invalid address family: %s", optarg); usage(); } break; case 'n': hints.ai_flags |= AI_NUMERICHOST; break; case 'N': hints.ai_flags |= AI_NUMERICSERV; break; case 's': service = optarg; break; case 'p': if (!parse_protocol(optarg, &hints.ai_protocol)) { warnx("invalid protocol: %s", optarg); usage(); } break; case 'P': hints.ai_flags |= AI_PASSIVE; break; case 't': if (!parse_socktype(optarg, &hints.ai_socktype)) { warnx("invalid socket type: %s", optarg); usage(); } break; case '?': default: usage(); } } argc -= optind; argv += optind; if (!((argc == 1) || ((argc == 0) && (hints.ai_flags & AI_PASSIVE)))) usage(); if (argc == 1) hostname = argv[0]; if (service != NULL) { char *p; if ((p = strchr(service, '/')) != NULL) { if (hints.ai_protocol != 0) { warnx("protocol already specified"); usage(); } *p = '\0'; p++; if (!parse_protocol(p, &hints.ai_protocol)) { warnx("invalid protocol: %s", p); usage(); } } } error = getaddrinfo(hostname, service, &hints, &addrinfo); if (error) errx(1, "%s", gai_strerror(error)); if ((hints.ai_flags & AI_CANONNAME) && (addrinfo != NULL)) { if (printf("canonname %s\n", addrinfo->ai_canonname) < 0) err(1, "printf"); } printaddrinfo(addrinfo); freeaddrinfo(addrinfo); return 0; }