2014-02-06 2 views
1

В клиентской программе, которую я написал, используется SCTP-сокеты для связи. Я использую sctp_recvmsg для чтения данных, доступных для конкретного пользователя из сокета. Я заметил, что порой sctp_recvmsg возвращает значение 0 вместо числа прочитанных байтов или -1, указывающих на ошибку. Я проверил свой код, и сокет, из которого считываются данные, не закрыт. Может ли кто-нибудь пролить свет на то, как такое поведение можно увидеть?Функция получения сообщений SCTP, возвращающая нуль

Спасибо заранее.

С уважением, Sujay

+0

Какую ОС вы используете? Linux, Solaris ... Не могли бы вы предоставить код? Если возможно, используйте tcpdump/snoop для захвата сетевых пакетов. –

ответ

0

Согласно this lksctp thread, sctp_recvmsg() возвращает 0, если другая сторона закрыла соединение, когда вы находитесь в связи с 1-на-1 SCP (see here для объяснения один-к-одному и один-ко-многим), то есть при создании сокета с SOCK_STREAM вместо SOCK_SEQPACKET.

Цитирование:

Возвращаемые значения из sctp_sendmsg и sctp_recvmsg не документированы, но я бы предположил, sctp_sendmsg вернется -1 и установить ERRNO к ECONNRESET точно так же, как sendmsg делает. Однако как насчет sctp_recvnmsg? Plain recvmsg должен возвращать 0, если половина соединения закрыта, но нет полуподключения в SCTP. Как функционирует функция точно?

sctp_recvmsg() будет возвращать 0 при завершении только на разъемах 1-к-1. Однако указанные выше уведомления будут работать в обоих стилях.