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



我希望以下代码*失败,因为服务器地址尚未设置有效值(在调试器中验证 - 整个结构确实初始化为 0,使地址系列AF_UNSPEC(。

* 不完整的说明性片段

static struct sockaddr_in g_server_addr; 
int main(void)
{
int hdl;
hdl = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (-1 == hdl)
{
printf("Client Socket creation failed.");
return -1;
}
if(-1 == connect(hdl, (struct sockaddr *) &g_server_addr, sizeof(g_server_addr)))
{
printf("Connect() on socket failed.");
return -1;
}
return 0;
}

我需要 connect(( 在输入不正确时失败。
(此代码正在 Ubuntu 机器上进行测试。

从连接手册页:

无连接套接字可以通过连接到 sockaddr 的sa_family成员设置为 AF_UNSPEC 的地址来解除关联(从内核 2.2 开始在 Linux 上支持(。

手册页有点过时了,它可以在任何可以断开连接的套接字上工作,例如 TCP 套接字。

实际上,尝试在尚未连接的流套接字上解散关联时不会出现错误。这就是您没有收到错误的原因。

如果需要收到错误,请使用无效族初始化地址族:

static struct sockaddr_in g_server_addr = { -1 };

这将产生错误-1 EAFNOSUPPORT (Address family not supported by protocol)

另请参阅最近的 Linux 内核net/ipv4/af_inet.c

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;

最新更新