我希望正确地检查SCTP客户机是否断开连接,并希望为SCTP端点启用SCTP_STATUS (即SOCK_SEQPACKET),但我似乎无法设置它。在这里解释过,https://linux.die.net/man/7/sctp
这意味着我的函数调用如下所示:
setsockopt(sock, SOL_SCTP, SCTP_STATUS, &1, sizeof(int))当调用它时,我得到“未找到协议”(代码: 92),尽管我的系统支持它,因为我可以完美地发送和接收SCTP数据包。
是什么导致了这种行为?还有其他选项可以检查客户端的连接状态吗?
发布于 2019-01-19 12:58:39
您尝试使用的选项不是用来激活特性的布尔值(就像SO_REUSEADDR那样)。它是一个只读的、功能齐全的struct sctp_status,如RFC6458中所定义的:
8.2。只读选项本节中定义的选项为只读选项。在setsockopt()调用中使用此选项将导致指示EOPNOTSUPP的错误。8.2.1.关联状态(SCTP_STATUS)应用程序可以检索有关关联的当前状态信息,包括关联状态、对等接收窗口大小、未确认数据块数和待接收数据块数。这个信息是只读的。以下结构用于访问此信息: struct sctp_status {
...
因此,要解决您的问题:完全删除这个setsockopt()调用。
您应该适当地使用getsockopt()。
下面是一些例子:
所以:SCTP多导
I=sizeof(State);if(ret= getsockopt(sock,SOL_SCTP,SCTP_STATUS,&status,(socklen_t *)&i)) != 0) perror("getsockopt");printf("\nSCTP状态:\n-“);printf("assoc id =%d”,status.sstat_assoc_id);printf("state = %d\n",status.sstat_state);printf("instrms = %d\n",status.sstat_instrms);printf("outstrms =%d n“,status.sstat_outstrms);
//check status opt\_len = (socklen\_t) sizeof(struct sctp\_status); getsockopt(SctpScocket, IPPROTO\_SCTP, SCTP\_STATUS, &status, &opt\_len);
https://unix.stackexchange.com/questions/495420
复制相似问题