SCTPクライアントの接続が失われたかどうかを正しく確認し、SCTPエンドポイントに対してSCTP_STATUS(たとえばSOCK_SEQPACKET)を有効にしたいが設定できないようです。ここで説明されていますhttps://linux.die.net/man/7/sctp
これは私の関数呼び出しが次のようになることを意味します。
setsockopt(sock, SOL_SCTP, SCTP_STATUS, &1, sizeof(int))
呼び出し時にSCTPパケットを完全に送受信できるため、システムがサポートしていても「プロトコルが見つかりません」(コード:92)というメッセージが表示されます。
この動作の原因は何ですか?クライアントの接続状態を確認する他のオプションはありますか?
ベストアンサー1
使用したいオプションは、(あなたがしたようにSO_REUSEADDR
)機能を有効にするためのブール値ではありません。それ読み取り専用struct sctp_status
定義どおりに完全に機能するRFC6458:
8.2. Read-Only Options The options defined in this subsection are read-only. Using this option in a setsockopt() call will result in an error indicating EOPNOTSUPP. 8.2.1. Association Status (SCTP_STATUS) Applications can retrieve current status information about an association, including association state, peer receiver window size, number of unacknowledged DATA chunks, and number of DATA chunks pending receipt. This information is read-only. The following structure is used to access this information: struct sctp_status {
[...]
したがって、問題を解決するには、このsetsockopt()
呼び出しを完全に削除してください。
getsockopt()
正しく使用してください。
いくつかの例:
だから:SCTPマルチホーミング
i = sizeof(status); if((ret = getsockopt(sock, SOL_SCTP, SCTP_STATUS, &status, (socklen_t *)&i)) != 0) perror("getsockopt"); printf("\nSCTP Status:\n--------\n"); printf("assoc id = %d\n", status.sstat_assoc_id); printf("state = %d\n", status.sstat_state); printf("instrms = %d\n", status.sstat_instrms); printf("outstrms = %d\n--------\n\n", status.sstat_outstrms);
//check status opt_len = (socklen_t) sizeof(struct sctp_status); getsockopt(SctpScocket, IPPROTO_SCTP, SCTP_STATUS, &status, &opt_len);