#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
в отдельный сокет. Новый сокет представляет собой сокет в стиле «один к одному».
Это особенно желательно, когда, например, приложение желает, чтобы несколько спорадических отправителей / получателей сообщений оставались в исходном сокете в стиле «один ко многим», но отделяли эти ассоциации, передающие большой объем трафика данных, от их собственных отдельных дескрипторов сокетов.