Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无效的connect()调用意外成功-为什么?_C_Sockets - Fatal编程技术网

无效的connect()调用意外成功-为什么?

无效的connect()调用意外成功-为什么?,c,sockets,C,Sockets,我预计以下代码*会失败,因为服务器地址没有设置有效值(在调试器中验证-整个结构确实初始化为0,使地址族AF_unsec) *不完整的说明性片段 当使用不正确的输入调用connect()时,我需要connect()失败。 (此代码正在Ubuntu机器上测试。)从connect手册页: 无连接套接字可以通过连接到sockaddr的sa_家族成员设置为AF_Unsec(自内核2.2以来Linux支持)的地址来解除关联 手册页有点过时,它可以在任何可以断开连接的套接字上工作,例如TCP套接字 实际上,在

我预计以下代码*会失败,因为服务器地址没有设置有效值(在调试器中验证-整个结构确实初始化为0,使地址族AF_unsec)

*不完整的说明性片段

当使用不正确的输入调用connect()时,我需要connect()失败。

(此代码正在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()尝试了什么吗?