1

在建立一对一的sctp连接过程中,sctp连接accept()后内部服务器日志报如下错误:

“获取套接字的套接字选项时出错:13”

从错误来看,似乎是getsockopt()返回了错误,根据“getsockopt(2) - Linux man page”中的函数描述设置了errno来说明原因。

我需要您的帮助以了解如何检查 errno 并跟踪此失败的原因。

仅供参考,来自 tcpdump 我有以下消息流,连接被服务器关闭。

编号 时间 源 目的地 协议 消息

19716 16:47:25.174569 client server SCTP INIT
19717 16:47:25.174667 server client SCTP INIT_ACK
19718 16:47:25.174905 client server SCTP COOKIE_ECHO
19719 16:47:25.174962 server client SCTP COOKIE_ACK
19720 16:47:25.175175 server client SCTP SHUTDOWN
19721 16:47:25.175507 客户端服务器 SCTP SHUTDOWN_ACK
19722 16:47:25.175537 服务器客户端 SCTP SHUTDOWN_COMPLETE

感谢您的支持,在此先感谢

4

2 回答 2

1

服务器生成 cookie 并通过 INIT 块发送给客户端。客户端响应一个带有 cookie 回显的响应,该回显应具有通过 INIT ACK 块进行身份验证和有效生命周期的签名。通过 INIT ACK 块接收的 cookie 应由服务器作为一种身份验证机制进行验证。如果服务器无法成功验证 cookie 并使用它来构建 TCB,则不应继续建立和使用关联。

请注意,perror 只是一个函数,它将为您提供给定错误代码的标准错误消息。也就是说,如果您调用 write() 并且出现错误,则可以在 write() 之后立即调用 perror 以了解实际错误。它在 stdio.h 中声明。

如果使用 perror 有困难,您可以尝试等效于 perror : fprintf(stderr, "%s\n", strerror(errno));

于 2014-10-15T16:19:26.597 回答
1

是你的代码吗?您应该使用strerror_r从错误号中获取消息。否则,您可以安装perror二进制文件以打印数字错误。

13 似乎是EACCES,手册页中没有记录(Linux上的一个常见问题)。快速内核搜索似乎表明最常见的原因是未启用 sctp 身份验证/加密,但这绝不是决定性的。

于 2014-07-16T22:45:27.907 回答