// // IPv6/v4 Client sample (checked on Win32/FreeBSD/MacOS X) // #include #include #ifdef _WIN32 # include # include const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT; const struct in6_addr in6addr_loopback = IN6ADDR_LOOPBACK_INIT; #else # include # include # include # include # define closesocket close # define INVALID_SOCKET -1 #endif int main(int argc, char **argv ) { char *host = "localhost"; char *port = "4913"; #ifdef _WIN32 // Startup WinSock2 WSADATA WSAData; WSAStartup(0x0202,&WSAData); #endif addrinfo hints, *addr; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; // IPv6/v4 hints.ai_socktype = SOCK_STREAM; // TCP int ret = getaddrinfo(host, port, &hints, &addr); int soc = INVALID_SOCKET; addrinfo *ai; for (ai = addr; ai != NULL; ai = ai->ai_next) { soc = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); if (soc == INVALID_SOCKET) continue; if (connect(soc, ai->ai_addr, ai->ai_addrlen) == 0) break; closesocket(soc); } if (ai == NULL) { fprintf(stderr, "fail to connect.\n"); freeaddrinfo(addr); return 1; } char remote[64]; if (getnameinfo(ai->ai_addr, ai->ai_addrlen, remote, sizeof(remote), NULL, 0, NI_NUMERICHOST) ) strcpy(remote, ""); printf("\nConnect for %s\n", remote); freeaddrinfo(addr); // recv message char msg[16]; int len=recv(soc, msg, sizeof(msg)-1,0); msg[len]=0; printf("Recv data: %s\n",msg); shutdown(soc,2); closesocket(soc); #ifdef _WIN32 WSACleanup(); // Cleanup WinSock #endif return 0; }