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; }
// // MS_Connect() // static INT32 MS_Connect(const char *ip_addr, const char *str_port, INT32 async) { #ifdef NONET (void)ip_addr; (void)str_port; (void)async; #else struct my_addrinfo *ai, *runp, hints; int gaie; memset (&hints, 0x00, sizeof(hints)); #ifdef AI_ADDRCONFIG hints.ai_flags = AI_ADDRCONFIG; #endif hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; //I_InitTcpNetwork(); this is already done on startup in D_SRB2Main() if (!I_InitTcpDriver()) // this is done only if not already done return MS_SOCKET_ERROR; gaie = I_getaddrinfo(ip_addr, str_port, &hints, &ai); if (gaie != 0) return MS_GETHOSTBYNAME_ERROR; else runp = ai; while (runp != NULL) { socket_fd = socket(runp->ai_family, runp->ai_socktype, runp->ai_protocol); if (socket_fd != BADSOCKET && socket_fd != (SOCKET_TYPE)ERRSOCKET) { if (async) // do asynchronous connection { #ifdef FIONBIO #ifdef WATTCP char res = 1; #else unsigned long res = 1; #endif ioctl(socket_fd, FIONBIO, &res); #endif if (connect(socket_fd, runp->ai_addr, (socklen_t)runp->ai_addrlen) == ERRSOCKET) { #ifdef _WIN32 // humm, on win32/win64 it doesn't work with EINPROGRESS (stupid windows) if (WSAGetLastError() != WSAEWOULDBLOCK) #else if (errno != EINPROGRESS) #endif { con_state = MSCS_FAILED; CloseConnection(); I_freeaddrinfo(ai); return MS_CONNECT_ERROR; } } con_state = MSCS_WAITING; FD_ZERO(&wset); FD_SET(socket_fd, &wset); select_timeout.tv_sec = 0, select_timeout.tv_usec = 0; I_freeaddrinfo(ai); return 0; } else if (connect(socket_fd, runp->ai_addr, (socklen_t)runp->ai_addrlen) != ERRSOCKET) { I_freeaddrinfo(ai); return 0; } } runp = runp->ai_next; } I_freeaddrinfo(ai); #endif return MS_CONNECT_ERROR; }