@@ -187,9 +187,6 @@ SctpTransport::SctpTransport(shared_ptr<Transport> lower, const Configuration &c
187
187
188
188
PLOG_DEBUG << " Initializing SCTP transport" ;
189
189
190
- usrsctp_register_address (this );
191
- Instances->insert (this );
192
-
193
190
mSock = usrsctp_socket (AF_CONN, SOCK_STREAM, IPPROTO_SCTP, nullptr , nullptr , 0 , nullptr );
194
191
if (!mSock )
195
192
throw std::runtime_error (" Could not create SCTP socket, errno=" + std::to_string (errno));
@@ -323,14 +320,14 @@ SctpTransport::SctpTransport(shared_ptr<Transport> lower, const Configuration &c
323
320
if (usrsctp_setsockopt (mSock , SOL_SOCKET, SO_SNDBUF, &sndBuf, sizeof (sndBuf)))
324
321
throw std::runtime_error (" Could not set SCTP send buffer size, errno=" +
325
322
std::to_string (errno));
323
+
324
+ usrsctp_register_address (this );
325
+ Instances->insert (this );
326
326
}
327
327
328
328
SctpTransport::~SctpTransport () {
329
329
stop ();
330
330
close ();
331
-
332
- usrsctp_deregister_address (this );
333
- Instances->erase (this );
334
331
}
335
332
336
333
void SctpTransport::onBufferedAmount (amount_callback callback) {
@@ -359,14 +356,6 @@ bool SctpTransport::stop() {
359
356
return true ;
360
357
}
361
358
362
- void SctpTransport::close () {
363
- if (mSock ) {
364
- mProcessor .join ();
365
- usrsctp_close (mSock );
366
- mSock = nullptr ;
367
- }
368
- }
369
-
370
359
struct sockaddr_conn SctpTransport::getSockAddrConn (uint16_t port) {
371
360
struct sockaddr_conn sconn = {};
372
361
sconn.sconn_family = AF_CONN;
@@ -416,6 +405,18 @@ void SctpTransport::shutdown() {
416
405
mWrittenCondition .notify_all ();
417
406
}
418
407
408
+ void SctpTransport::close () {
409
+ if (!mSock )
410
+ return ;
411
+
412
+ usrsctp_deregister_address (this );
413
+ Instances->erase (this );
414
+
415
+ mProcessor .join ();
416
+ usrsctp_close (mSock );
417
+ mSock = nullptr ;
418
+ }
419
+
419
420
bool SctpTransport::send (message_ptr message) {
420
421
std::lock_guard lock (mSendMutex );
421
422
@@ -705,21 +706,26 @@ void SctpTransport::sendReset(uint16_t streamId) {
705
706
}
706
707
707
708
void SctpTransport::handleUpcall () {
708
- if (!mSock )
709
- return ;
709
+ try {
710
+ if (!mSock )
711
+ return ;
710
712
711
- PLOG_VERBOSE << " Handle upcall" ;
713
+ PLOG_VERBOSE << " Handle upcall" ;
712
714
713
- int events = usrsctp_get_events (mSock );
715
+ int events = usrsctp_get_events (mSock );
714
716
715
- if (events & SCTP_EVENT_READ && mPendingRecvCount == 0 ) {
716
- ++mPendingRecvCount ;
717
- mProcessor .enqueue (&SctpTransport::doRecv, shared_from_this ());
718
- }
717
+ if (events & SCTP_EVENT_READ && mPendingRecvCount == 0 ) {
718
+ ++mPendingRecvCount ;
719
+ mProcessor .enqueue (&SctpTransport::doRecv, shared_from_this ());
720
+ }
719
721
720
- if (events & SCTP_EVENT_WRITE && mPendingFlushCount == 0 ) {
721
- ++mPendingFlushCount ;
722
- mProcessor .enqueue (&SctpTransport::doFlush, shared_from_this ());
722
+ if (events & SCTP_EVENT_WRITE && mPendingFlushCount == 0 ) {
723
+ ++mPendingFlushCount ;
724
+ mProcessor .enqueue (&SctpTransport::doFlush, shared_from_this ());
725
+ }
726
+
727
+ } catch (const std::exception &e) {
728
+ PLOG_ERROR << " SCTP upcall: " << e.what ();
723
729
}
724
730
}
725
731
0 commit comments