在建立一对一sctp连接期间,在sctp连接的accept()之后,内部服务器日志中会报告以下错误:
“获取套接字的套接字选项时出错:13”
从错误中看,似乎getsockopt()返回了一个错误,并根据“getsockopt(2) - Linux手册页”中的函数说明设置errno来指示原因。
我需要你的帮助才能知道如何检查错误并跟踪失败的原因。
仅供参考,来自tcpdump我有以下消息流,连接被服务器关闭。
没有。时间源目标协议消息
19716 16:47:25.174569客户端服务器SCTP INIT
19717 16:47:25.174667服务器客户端SCTP INIT_ACK
19718 16:47:25.174905客户端服务器SCTP COOKIE_ECHO
19719 16:47:25.174962服务器客户端SCTP COOKIE_ACK
19720 16:47:25.175175服务器客户端SCTP SHUTDOWN
19721 16:47:25.175507客户端服务器SCTP SHUTDOWN_ACK
19722 16:47:25.175537服务器客户端SCTP SHUTDOWN_COMPLETE
感谢您的支持, 提前致谢
答案 0 :(得分:0)
这是你的代码吗?您应该使用strerror_r
从错误号中获取消息。否则,您可以安装perror
二进制文件来打印数字错误。
13似乎是EACCES
,在手册页中没有记录(Linux上常见的问题)。快速内核搜索似乎表明最常见的原因是未启用sctp身份验证/加密,但这绝不是决定性的。
答案 1 :(得分:0)
服务器生成cookie并通过INIT块发送给客户端。客户端回复带有cookie的回声,该回声应具有用于认证的签名。通过INIT ACK块有效生命周期。通过INIT ACK块接收的cookie应由服务器验证为一种认证机制。如果服务器无法成功验证cookie并使用它来构建TCB,那么它就不会继续建立和使用该关联。
请注意,perror只是一个函数,它会为您提供给定错误代码的标准错误消息。也就是说,如果你调用write()并且如果有错误,你可以在write()之后立即调用perror来了解实际的错误。它在stdio.h中声明。
使用perror时遇到困难,你可以尝试相当于perror: fprintf(stderr,“%s \ n”,strerror(errno));