无效的connect()调用意外成功-为什么?
我预计以下代码*会失败,因为服务器地址没有设置有效值(在调试器中验证-整个结构确实初始化为0,使地址族AF_unsec) *不完整的说明性片段 当使用不正确的输入调用connect()时,我需要connect()失败。无效的connect()调用意外成功-为什么?,c,sockets,C,Sockets,我预计以下代码*会失败,因为服务器地址没有设置有效值(在调试器中验证-整个结构确实初始化为0,使地址族AF_unsec) *不完整的说明性片段 当使用不正确的输入调用connect()时,我需要connect()失败。 (此代码正在Ubuntu机器上测试。)从connect手册页: 无连接套接字可以通过连接到sockaddr的sa_家族成员设置为AF_Unsec(自内核2.2以来Linux支持)的地址来解除关联 手册页有点过时,它可以在任何可以断开连接的套接字上工作,例如TCP套接字 实际上,在
(此代码正在Ubuntu机器上测试。)从connect手册页: 无连接套接字可以通过连接到sockaddr的sa_家族成员设置为AF_Unsec(自内核2.2以来Linux支持)的地址来解除关联 手册页有点过时,它可以在任何可以断开连接的套接字上工作,例如TCP套接字 实际上,在尝试解除尚未连接的流套接字上的关联时没有错误。这就是为什么你没有得到一个错误 如果需要获取错误,请使用无效族初始化地址族:
static struct sockaddr_in g_server_addr = { -1 };
这将产生错误-1 EAFNOSUPPORT(协议不支持地址系列)
另请参见最新linux内核的介绍:
int __inet_stream_connect(struct socket *sock, struct sockaddr *uaddr,
int addr_len, int flags) {
...
if (uaddr->sa_family == AF_UNSPEC) {
err = sk->sk_prot->disconnect(sk, flags);
sock->state = err ? SS_DISCONNECTING : SS_UNCONNECTED;
goto out;
}
...
out:
return err;
从连接手册页: 无连接套接字可以通过连接到sockaddr的sa_家族成员设置为AF_Unsec(自内核2.2以来Linux支持)的地址来解除关联 手册页有点过时,它可以在任何可以断开连接的套接字上工作,例如TCP套接字 实际上,在尝试解除尚未连接的流套接字上的关联时没有错误。这就是为什么你没有得到一个错误 如果需要获取错误,请使用无效族初始化地址族:
static struct sockaddr_in g_server_addr = { -1 };
这将产生错误-1 EAFNOSUPPORT(协议不支持地址系列)
另请参见最新linux内核的介绍:
int __inet_stream_connect(struct socket *sock, struct sockaddr *uaddr,
int addr_len, int flags) {
...
if (uaddr->sa_family == AF_UNSPEC) {
err = sk->sk_prot->disconnect(sk, flags);
sock->state = err ? SS_DISCONNECTING : SS_UNCONNECTED;
goto out;
}
...
out:
return err;
此部分对无连接套接字有效。我将套接字初始化为
SOCK\u STREAM
@work.bin,正如我试图传达的那样,手册页在这方面已经过时。它还将断开TCP套接字的连接,如果套接字已断开连接,则不会产生错误。我现在更明确地说明这一点。您如何知道connect()
手册页已经过时?(这不是一个挑战,从表面上看问题)是否有一个存储库,我可以在将来参考“当前”手册页?@work.bin检查来源,我在回答中添加了相关部分感谢来源参考。顺便说一句,您知道在AF_unsec的connect()调用中调用disconnect()尝试了什么吗?这部分对无连接套接字有效。我将套接字初始化为SOCK\u STREAM
@work.bin,正如我试图传达的那样,手册页在这方面已经过时。它还将断开TCP套接字的连接,如果套接字已断开连接,则不会产生错误。我现在更明确地说明这一点。您如何知道connect()
手册页已经过时?(这不是一个挑战,从表面上看问题)是否有一个存储库,我可以在将来参考“当前”手册页?@work.bin检查来源,我在回答中添加了相关部分感谢来源参考。顺便说一句,您知道在AF_unsec的connect()调用中调用disconnect()尝试了什么吗?