2323#include " C_Socket.hpp"
2424#include " C_SocketSCTP.hpp"
2525
26+ #include < sys/socket.h>
27+ #include < netinet/in.h>
28+ #include < arpa/inet.h>
29+
2630
2731#define MSGFLAG 0
2832#define MAX_OUTGOING 128
@@ -100,7 +104,6 @@ void C_SocketSCTPListen::set_properties() {
100104 SOCKET_ERROR (1 , " Unable to set SCTP_EVENTS option" );
101105 }
102106
103- // SCTP END
104107
105108 }
106109 // size of recv buf
@@ -182,10 +185,26 @@ int C_SocketSCTPListen::_open (size_t P_buffer_size,
182185 // set_properties() ;
183186
184187 /* bind the socket to the newly formed address */
185- L_rc = bind (m_socket_id,
186- (sockaddr *)(void *)&(m_source_addr_info->m_addr ),
187- SOCKADDR_IN_SIZE (&(m_source_addr_info->m_addr )));
188- /* check there was no error */
188+
189+ struct sockaddr_storage *bind_addr = NULL ;
190+ unsigned int cc = 0 ;
191+ SOCKET_DEBUG (0 , " bind1 start" );
192+ unsigned int bind_addr_count = m_source_addr_info->m_addrs_src .size ();
193+ for (unsigned int i = 0 ; i < bind_addr_count; i++) {
194+ sockaddr_in *so = (sockaddr_in *)(m_source_addr_info->m_addrs_src [i]->ai_addr );
195+ size_t addrlen = m_source_addr_info->m_addrs_src [i]->ai_addrlen ;
196+ SOCKET_DEBUG (0 , " bind to " << inet_ntoa (so->sin_addr )
197+ << " :" << ntohs (so->sin_port ));
198+ bind_addr = (sockaddr_storage*)realloc (bind_addr, cc + addrlen);
199+ memcpy ((char *)bind_addr + cc, so, addrlen);
200+ cc += addrlen;
201+ }
202+
203+ SOCKET_DEBUG (0 , " binding stop" );
204+ L_rc = sctp_bindx (m_socket_id,
205+ (struct sockaddr *)bind_addr,
206+ bind_addr_count, SCTP_BINDX_ADD_ADDR);
207+ /* check there was no error */
189208 if (L_rc) {
190209 SOCKET_ERROR (1 , " bind [" << strerror (errno) << " ]" );
191210 } else {
@@ -809,9 +828,22 @@ int C_SocketSCTPServer::_open_udp (size_t P_buffer_size,
809828 m_buffer_size = P_buffer_size ;
810829
811830 /* bind the socket to the newly formed address */
812- L_rc = bind (m_socket_id,
813- (sockaddr *)(void *)&(m_source_udp_addr_info->m_addr ),
814- SOCKADDR_IN_SIZE (&(m_source_udp_addr_info->m_addr )));
831+ struct sockaddr_storage *bind_addr = NULL ;
832+ unsigned int cc = 0 ;
833+ unsigned int bind_addr_count = m_source_udp_addr_info->m_addrs_src .size ();
834+ for (unsigned int i = 0 ; i < bind_addr_count; i++) {
835+ sockaddr_in *so = (sockaddr_in *)(m_source_udp_addr_info->m_addrs_src [i]->ai_addr );
836+ size_t addrlen = m_source_udp_addr_info->m_addrs_src [i]->ai_addrlen ;
837+ SOCKET_DEBUG (0 , " bind to " << inet_ntoa (so->sin_addr )
838+ << " :" << ntohs (so->sin_port ));
839+ bind_addr = (sockaddr_storage*)realloc (bind_addr, cc + addrlen);
840+ memcpy ((char *)bind_addr + cc, so, addrlen);
841+ cc += addrlen;
842+ }
843+
844+ L_rc = sctp_bindx (m_socket_id,
845+ (struct sockaddr *)bind_addr,
846+ bind_addr_count, SCTP_BINDX_ADD_ADDR);
815847 /* check there was no error */
816848 if (L_rc) {
817849 SOCKET_ERROR (1 , " bind [" << strerror (errno) << " ]" );
@@ -894,31 +926,45 @@ int C_SocketSCTPClient::_open(T_pOpenStatus P_status,
894926 if (L_rc == 0 ) {
895927
896928 if (m_type == E_SOCKET_TCP_MODE) {
929+ // SCTP MULTIHOMING CLIENT BINDING
930+ struct sockaddr_storage *bind_addr = NULL ;
931+ unsigned int cc = 0 ;
932+ unsigned int bind_addr_count = m_remote_addr_info->m_addrs_src .size ();
933+ for (unsigned int i = 0 ; i < bind_addr_count; i++) {
934+ sockaddr_in *so = (sockaddr_in *)(m_remote_addr_info->m_addrs_src [i]->ai_addr );
935+ size_t addrlen = m_remote_addr_info->m_addrs_src [i]->ai_addrlen ;
936+ SOCKET_DEBUG (0 , " bind to " << inet_ntoa (so->sin_addr )
937+ << " :" << ntohs (so->sin_port ));
938+ bind_addr = (sockaddr_storage*)realloc (bind_addr, cc + addrlen);
939+ memcpy ((char *)bind_addr + cc, so, addrlen);
940+ cc += addrlen;
941+ }
897942
898-
899- /* struct sockaddr_storage *connect = NULL; */
900- /* unsigned int cc = 0, count = 0; */
901- /* if(m_remote_addr_info->m_addrs_dst > 0) { */
902- /* // SCTP MULTIHOMING CONNECT */
903- /* for (unsigned int i = 0; i < m_remote_addr_info->m_addrs_dst.size(); i++) { */
904- /* sockaddr_in addr = m_remote_addr_info->m_addrs_dst[i]; */
905- /* SOCKET_DEBUG(1, "multihoming client dst " << inet_ntoa(addr->sin_addr)); */
906- /* } */
907- /* } */
908- /* connect = reallock */
909- if (m_remote_addr_info->m_value != NULL ) {
910- L_rc = bind (m_socket_id,
911- (sockaddr *)(void *)&(m_remote_addr_info->m_addr_src ),
912- SOCKADDR_IN_SIZE (&(m_remote_addr_info->m_addr_src )));
913- if (L_rc) {
914- SOCKET_ERROR (1 , " bind [" << strerror (errno) << " ]" );
943+ if (bind_addr_count > 0 ) {
944+ if (sctp_bindx (m_socket_id,
945+ (struct sockaddr *)bind_addr,
946+ bind_addr_count, SCTP_BINDX_ADD_ADDR)) {
947+ SOCKET_ERROR (1 , " error bind client [" << strerror (errno) << " ]" );
915948 }
916949 }
917950
918- L_rc = connect (m_socket_id,
919- (struct sockaddr *)(void *)&(m_remote_addr_info->m_addr ),
920- SOCKADDR_IN_SIZE (&(m_remote_addr_info->m_addr ))) ;
921-
951+
952+ struct sockaddr_storage *connect_addr = NULL ;
953+ cc = 0 ;
954+ unsigned int connect_addr_count = m_remote_addr_info->m_addrs_dst .size ();
955+ for (unsigned int i = 0 ; i < connect_addr_count; i++) {
956+ sockaddr_in *so = (sockaddr_in *)(m_remote_addr_info->m_addrs_dst [i]->ai_addr );
957+ size_t addrlen = m_remote_addr_info->m_addrs_dst [i]->ai_addrlen ;
958+ SOCKET_DEBUG (0 , " connect to " << inet_ntoa (so->sin_addr )
959+ << " :" << ntohs (so->sin_port ));
960+ connect_addr = (sockaddr_storage*)realloc (connect_addr, cc + addrlen);
961+ memcpy ((char *)connect_addr + cc, so, addrlen);
962+ cc += addrlen;
963+ }
964+
965+ L_rc = sctp_connectx (m_socket_id,
966+ (struct sockaddr *)connect_addr,
967+ connect_addr_count, 0 );
922968 if (L_rc) {
923969 if (errno != EINPROGRESS) {
924970 SOCKET_ERROR (1 , " connect failed ["
@@ -937,9 +983,23 @@ int C_SocketSCTPClient::_open(T_pOpenStatus P_status,
937983 *P_status = E_OPEN_OK ;
938984 }
939985 } else {
940- L_rc = bind (m_socket_id,
941- (sockaddr *)(void *)&(m_remote_addr_info->m_addr_src ),
942- SOCKADDR_IN_SIZE (&(m_remote_addr_info->m_addr_src )));
986+ struct sockaddr_storage *bind_addr = NULL ;
987+ unsigned int cc = 0 ;
988+ SOCKET_DEBUG (0 , " bind start" );
989+ unsigned int bind_addr_count = m_remote_addr_info->m_addrs_src .size ();
990+ for (unsigned int i = 0 ; i < bind_addr_count; i++) {
991+ sockaddr_in *so = (sockaddr_in *)(m_remote_addr_info->m_addrs_src [i]->ai_addr );
992+ size_t addrlen = m_remote_addr_info->m_addrs_src [i]->ai_addrlen ;
993+ SOCKET_DEBUG (0 , " bind to " << inet_ntoa (so->sin_addr )
994+ << " :" << ntohs (so->sin_port ));
995+ bind_addr = (sockaddr_storage*)realloc (bind_addr, cc + addrlen);
996+ memcpy ((char *)bind_addr + cc, so, addrlen);
997+ cc += addrlen;
998+ }
999+
1000+ L_rc = sctp_bindx (m_socket_id,
1001+ (struct sockaddr *)bind_addr,
1002+ bind_addr_count, SCTP_BINDX_ADD_ADDR);
9431003
9441004 if (L_rc) {
9451005 SOCKET_ERROR (1 , " bind [" << strerror (errno) << " ]" );
0 commit comments