Как отправить сообщение в ассоциацию SCTP, которая найдена во время получения?

#c #c #networking #sctp

#c #c #сеть #sctp

Вопрос:

У меня есть сокет для получения данных от нескольких клиентов.

    sockfd = socket(...); 
   bind(sockfd, ...); 
   listen(sockfd, ...); 
   while (true) { 
    nread = sctp_rcvmsg(sockfd, ..., buf, ..., amp;info); 
    assoc_id = sinfo.sinfo_assoc_id; 
    stream = sinfo.sinfo_stream; 
    handle_message(assoc_id, stream, buf, nread); 
   }
  

Я получаю идентификатор ассоциации для каждого соединения. Мой вопрос в том, как я могу отправить ответное сообщение по идентификатору ассоциации, а не используя адрес клиента (например, sctp_sendmsg не имеет параметра идентификатора ассоциации)

Ответ №1:

Из http://linux.die.net/man/3/sctp_peeloff

 int sctp_peeloff(int sd, sctp_assoc_t assoc_id);
  

sctp_peeloff ответвляется от существующей ассоциации assoc_id в сокете стиля «один ко многим» sd в отдельный сокет. Новый сокет представляет собой сокет в стиле «один к одному».

Это особенно желательно, когда, например, приложение желает, чтобы несколько спорадических отправителей / получателей сообщений оставались в исходном сокете в стиле «один ко многим», но отделяли эти ассоциации, передающие большой объем трафика данных, от их собственных отдельных дескрипторов сокетов.