【问题标题】:What are the reasons socket creation can fail?套接字创建失败的原因是什么?
【发布时间】:2019-01-28 18:15:11
【问题描述】:

我正在创建一个带有以下参数的套接字-

fd = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);

但由于某种原因,套接字创建失败并且 fd 设置为 -1。

  1. 我想了解创建套接字失败的全部原因是什么?
  2. 如何确定在我的情况下套接字创建失败的原因是什么?

注意:这始终是可重现的,我们以 500 毫秒的间隔连续 5 次重试套接字创建,但 5 次都失败了。

【问题讨论】:

  • man 3 socket。寻找errno

标签: c sockets network-programming serversocket unix-socket


【解决方案1】:

正如 Eugene Sh / WeatherVane 所说,查看错误:

#include <errno.h>
#include <stdio.h>
#include <string.h>
...
fd = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
if (fd == -1) {
  printf("error cannot create socket, errno = %d : %s\n",
         errno, strerror(errno));
  ...return/exit etc
}
...

我错了还是域必须是PF_INET,那么socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP); 必须是socket(PF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);

sctp(7) - Linux man page

编辑:在 raspbian (Linux raspberrypi 4.14.79) 下我可以两者都做


如果您以 root 身份运行,是否也会发生错误?特别是如果您在 Android 下(请参阅what can cause a socket() “Permission denied” error?

【讨论】:

  • @EugeneSh。哦,是的,我忘记了,我总是在包含文件中 grep 以从其编号中查找错误的名称^^
  • 提供描述性消息的是strerror( errno )
  • @WeatherVane 太实用了,用起来就想犯错lol
  • 谢谢@bruno。我刚刚检查了错误类型。我得到 EACCES (13) - 权限被拒绝。由于“权限被拒绝”的原因,套接字创建失败的原因是什么?
  • 此外,我也尝试将族类型更改为 PF_INET;还是一样的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多