#include #include #include #include #include #include int main(void) { int sock; struct sockaddr_in6 server_addr, source_addr; struct in6_pktinfo pktinfo; char buf[256]; /* Create IPv6 TCP socket */ sock = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); if (sock < 0) { perror("socket"); return (1); } /* Set outgoing interface via IPV6_PKTINFO socket option */ memset(&pktinfo, 0, sizeof(pktinfo)); /* HERE IS THE ifindex */ pktinfo.ipi6_ifindex = 3; if (setsockopt(sock, IPPROTO_IPV6, IPV6_PKTINFO, &pktinfo, sizeof(pktinfo)) < 0) { perror("setsockopt IPV6_PKTINFO"); close(sock); return (1); } /* Set up destination address */ memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin6_family = AF_INET6; server_addr.sin6_port = htons(80); inet_pton(AF_INET6, "2606:4700::6810:b8f1", &server_addr.sin6_addr); /* Connect to server */ if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("connect"); close(sock); return (1); } printf("Connected successfully!\n"); /* Send GET request before */ const char *get_request = "GET / HTTP/1.1\r\nHost: icanhazip.com\r\n" "Connection: close\r\n\r\n"; if (send(sock, get_request, strlen(get_request), 0) < 0) { perror("send"); close(sock); return (1); } printf("Sent GET request\n"); /* Send GET request after */ if (send(sock, get_request, strlen(get_request), 0) < 0) { perror("send"); close(sock); return (1); } printf("Recv GET response\n"); /* Receive response */ ssize_t n; while ((n = recv(sock, buf, sizeof(buf) - 1, 0)) > 0) { buf[n] = '\0'; printf("%s", buf); } close(sock); return (0); }