SCTPクライアントがSCTPエンドポイントから切断されていることを確認してください。

SCTPクライアントがSCTPエンドポイントから切断されていることを確認してください。

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);

SCTPサーバークライアントCコード

   //check status
   opt_len = (socklen_t) sizeof(struct sctp_status);
   getsockopt(SctpScocket, IPPROTO_SCTP, SCTP_STATUS, &status, &opt_len);

おすすめ記事