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