我正在尝试解决以下介绍性 POSIX 套接字练习:
编写一个 TCP 回显客户端实现“使用 bind() 以便系统选择地址和端口”。
(我假设“系统”是指操作系统。)
我不明白为什么当 connect() 以上述方式执行绑定时需要调用 bind() (如果我不正确,请纠正我)。此外,提供给 bind() 调用的套接字地址需要哪些 sin6_addr 和 sin6_port 值才能完成此行为?
我正在尝试解决以下介绍性 POSIX 套接字练习:
编写一个 TCP 回显客户端实现“使用 bind() 以便系统选择地址和端口”。
(我假设“系统”是指操作系统。)
我不明白为什么当 connect() 以上述方式执行绑定时需要调用 bind() (如果我不正确,请纠正我)。此外,提供给 bind() 调用的套接字地址需要哪些 sin6_addr 和 sin6_port 值才能完成此行为?
你是对的,bind
不需要打电话。connect
如果您不选择源地址和源端口,系统会选择您的源地址和源端口bind
。
这是一个练习。它只是测试你是否知道如何使用bind
这种方式。
我不明白为什么当 connect() 以上述方式执行绑定时需要调用 bind() (如果我不正确,请纠正我)。
你是对的。
此外,提供给 bind() 调用的套接字地址需要哪些 sin6_addr 和 sin6_port 值才能完成此行为?
IPv4 的 INADDR_ANY。我将把 IPv6 作为练习留给读者。
您还应该指定零作为端口号,然后系统将选择。
编辑:这与所要求的相反。对不起,我认为问题是关于用户选择 IP 地址和端口。感谢 EJP 指出这一点。
这应该是您正在寻找的。
这应该是最有趣的部分:
clnt_addr.sin_family = AF_INET;
clnt_addr.sin_addr.s_addr = INADDR_ANY;
clnt_addr.sin_port = htons(33333);
if (bind(sockfd, (struct sockaddr *) &clnt_addr,
sizeof(clnt_addr)) < 0)
error("ERROR on binding");
在此示例中,套接字仅在 connect() 之前绑定到所需的端口 (33333),但在您的练习中,您可以将上述代码的第二行更改为:
clnt_addr.sin_addr.s_addr = inet_addr("192.168.0.1");
让套接字也绑定在特定的 IP 地址上。这里重要的是在 connect() 之前绑定套接字将 TCP/IP 通信的端点设置为使用所需的 IP 地址/端口。如果没有 bind(),您的套接字将是无限的:内核将为您选择源 IP 地址,并为您的套接字分配一个随机源端口。