as Ian said:
struct sockaddr *addr = (struct sockaddr *)&dst_addr;
should be:
struct sockaddr *addr = (struct sockaddr *)dst_addr;
struct sockaddr *interlcal = (struct sockaddr *)&src_addr;
should be struct sockaddr *interlcal = (struct sockaddr *)src_addr
bind(sockfd, interlcal, sizeof(interlcal));
should be: bind(sockfd, interlcal, sizeof(*src_addr));
(note: this didn't work but the binding one did) connect(sockfd, addr, sizeof(addr));
should be connect(sockfd, addr, sizeof(*dst_addr));
Just adding this so I can help others see this more easily, and so this question can be answered