1

我正在尝试解决以下介绍性 POSIX 套接字练习:

编写一个 TCP 回显客户端实现“使用 bind() 以便系统选择地址和端口”。

(我假设“系统”是指操作系统。)

我不明白为什么当 connect() 以上述方式执行绑定时需要调用 bind() (如果我不正确,请纠正我)。此外,提供给 bind() 调用的套接字地址需要哪些 sin6_addr 和 sin6_port 值才能完成此行为?

4

3 回答 3

2

你是对的,bind不需要打电话。connect如果您不选择源地址和源端口,系统会选择您的源地址和源端口bind

这是一个练习。它只是测试你是否知道如何使用bind这种方式。

于 2012-05-16T19:59:20.233 回答
1

我不明白为什么当 connect() 以上述方式执行绑定时需要调用 bind() (如果我不正确,请纠正我)。

你是对的。

此外,提供给 bind() 调用的套接字地址需要哪些 sin6_addr 和 sin6_port 值才能完成此行为?

IPv4 的 INADDR_ANY。我将把 IPv6 作为练习留给读者。

您还应该指定零作为端口号,然后系统将选择。

于 2012-05-17T02:18:00.307 回答
-1

编辑:这与所要求的相反。对不起,我认为问题是关于用户选择 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 地址,并为您的套接字分配一个随机源端口。

于 2012-05-16T20:14:55.803 回答