Listing 1. multi_homed_client.c #include #include #include #include #include #include #include int main(int argc, char *argv[]) { int sockfd; int n; struct sockaddr_in addr, *addresses; int addr_size = sizeof(struct sockaddr_in); int addr_count = argc - 2; int port; if (argc < 2) { fprintf(stderr, "Usage %s client-addresses...\n", argv[0]); exit(1); } /* create endpoint */ sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP); if (sockfd < 0) { perror("socket"); exit(2); } addresses = malloc(addr_size * addr_count); if (addresses == NULL) { perror("malloc"); exit(1); } /* do bind to get ephemeral port first */ addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr(argv[1]); addr.sin_port = 0; if (bind(sockfd, (struct sockaddr *) &addr, addr_size) == -1) { perror("bind"); exit(1); } /* this gets sin.sin_port so we can find the ephemeral port */ getsockname(sockfd, (struct sockaddr *) &addr, &addr_size); port = addr.sin_port; printf("Ephemeral port is %d\n", port); for ( n = 2; n < argc; n++) { addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr(argv[n]); addr.sin_port = port; memcpy(addresses + (n-2), &addr, addr_size); } if (sctp_bindx(sockfd, (struct sockaddr *) addresses, addr_count, SCTP_BINDX_ADD_ADDR) == -1) { perror("sctp bindx"); exit(2); } /* get local list */ addr_count = sctp_getladdrs(sockfd, 0, (struct sockaddr**)&addresses); for (n = 0; n < addr_count; n++) { memcpy(&addr, addresses+n, addr_size); printf("addr %s, port %d\n", inet_ntoa(addr.sin_addr.s_addr), addr.sin_port); } /* we don't actually connect to any server in this program */ close(sockfd); exit(0); }