// // IPv6 Server 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 #endif int main(int argc, char **argv ) { int port = 4913; char *msg = "OK\n"; #ifdef _WIN32 // Startup WinSock2 WSADATA WSAData; WSAStartup(0x0202,&WSAData); #endif // Create listen socket int listen_socket = socket(AF_INET6, SOCK_STREAM, 0); if (listen_socket == -1) { fprintf(stderr, "%s: fail to socket()\n", argv[0]); return 1; } // for TIME_WAIT int on = 1; setsockopt(listen_socket, SOL_SOCKET, SO_REUSEADDR, (char * ) & on, sizeof (on)); //setsockopt(listen_socket, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&on, sizeof(on)); sockaddr_in6 addr; memset(&addr,0,sizeof(addr)); addr.sin6_family = AF_INET6; // AF_INET AF_INET6 AF_UNSPEC addr.sin6_port = htons(port); addr.sin6_addr = in6addr_any; // Bind if (bind(listen_socket, (sockaddr*)&addr, sizeof(addr)) == -1) { fprintf(stderr, "%s: fail to bind()\n", argv[0]); closesocket(listen_socket); return 1; } // Listen if (listen(listen_socket, 5) == -1) { fprintf(stderr, "%s: fail to listen()\n", argv[0]); closesocket(listen_socket); return 1; } // Accept sockaddr_in6 remoteaddr; socklen_t len = sizeof(remoteaddr); int soc=accept(listen_socket,(sockaddr*)&remoteaddr,&len); char remote[64]; if (getnameinfo((sockaddr*)&remoteaddr, len, remote, sizeof(remote), NULL, 0, NI_NUMERICHOST) ) strcpy(remote, ""); printf("\nConnect from %s\n", remote); // send message send(soc, msg, strlen(msg),0); shutdown(soc,2); closesocket(soc); closesocket(listen_socket); #ifdef _WIN32 WSACleanup(); // Cleanup WinSock #endif return 0; }