Listing 1. multi_homed_client.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#include <netinet/sctp.h>

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);
}

