我必须对软件的套接字相关要求进行测试。作为测试的一部分,我必须创建一个套接字创建失败的案例。我的问题是如何让 C 语言 socket() 函数返回错误值 -1。以下是在软件中创建套接字的代码行。
int socket = socket(AF_INET, SOCK_DGRAM, 0);
系统配置:
- 操作系统:Windriver VxWorks
- 语言:C
除了无效参数或极低资源条件外,套接字创建很少失败(但在这些情况下,通常没有任何效果,因此尝试恢复是一项不可能完成的任务)。
例如,在运行时可能会失败的是listen
调用,因为另一个进程已经在侦听同一端口。
在 Windows 中,套接字创建最常见的失败是因为尚未执行 winsock 初始化调用。这是 IMO API 中的一个可怕的设计错误(太糟糕了,让我认为这是无缘无故地阻止可移植性的故意尝试)。
手册页说:
错误
EACCES
创建指定类型和/或协议的套接字的权限被拒绝。
EAFNOSUPPORT
该实现不支持指定的地址族。
EINVAL
未知协议或协议系列不可用。
EINVAL
类型中的标志无效。
EMFILE
处理文件表溢出。
ENFILE
已达到打开文件总数的系统限制。
ENOBUFS
或ENOMEM
可用内存不足。在释放足够的资源之前,无法创建套接字。
EPROTONOSUPPORT
此域不支持协议类型或指定的协议。底层协议模块可能会产生其他错误。
传入套接字类型的无效值。或者打开太多文件句柄,以至于无法为套接字创建一个新句柄(这需要的数量因操作系统和版本而异)。