检查 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))

调用它时,我收到“未找到协议”(代码:92),即使我的系统支持它,因为我可以完美地发送和接收 SCTP 数据包。

是什么导致了这种行为?是否还有其他选项来检查客户端的连接状态?

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

相关内容