【问题标题】:Linux: Error getting socket options for sctp connectionLinux:获取 sctp 连接的套接字选项时出错
【发布时间】:2014-09-07 14:46:05
【问题描述】:

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

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

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

我需要您的帮助来了解如何检查 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

感谢您的支持, 提前致谢

【问题讨论】:

    标签: linux sockets sctp


    【解决方案1】:

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

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

    【讨论】:

    • 不,这不是我的代码,您能指导我如何获取、安装和使用“perror”二进制文件吗?您能否分享有关此 sctp 身份验证/加密问题的更多信息?
    【解决方案2】:

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

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

    如果使用 perror 有困难,你可以试试 perror 的等价物: fprintf(stderr, "%s\n", strerror(errno));

    【讨论】:

      猜你喜欢
      • 2016-05-04
      • 2017-10-27
      • 2014-07-18
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 2015-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多