Networking POSIX套接字绑定()练习

Networking POSIX套接字绑定()练习,networking,posix,Networking,Posix,我正在尝试解决以下介绍性POSIX套接字练习: 编写一个TCP echo客户端实现“使用bind(),以便系统同时选择地址和端口” (我假设“系统”指的是操作系统。) 我不明白当connect()以上述方式执行绑定时,为什么必须调用bind()(如果我不正确,请纠正我)。另外,提供给bind()调用的套接字地址需要哪些sin6_addr和sin6_port值才能完成此行为?如果您是正确的,则不需要使用bind调用。如果不进行绑定,系统将在连接时选择源地址和源端口 这是一个练习。它只是测试您是否知

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

编写一个TCP echo客户端实现“使用bind(),以便系统同时选择地址和端口”

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


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

如果您是正确的,则不需要使用
bind
调用。如果不进行绑定,系统将在连接时选择源地址和源端口


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

编辑:这与所要求的相反。对不起,我以为问题是关于用户选择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");
使套接字也绑定到特定的IP地址。这里重要的是,在connect()之前绑定套接字将TCP/IP通信的端点设置为使用所需的IP地址/端口。如果没有bind(),您的套接字将是无限的:内核将为您选择源IP地址,并将随机源端口分配给您的套接字

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

你说得对

此外,sin6_addr和sin6_port的哪些值是必需的 对于提供给bind()调用以完成此操作的套接字地址 行为

不支持IPv4的任何应用程序。我将把IPv6留给读者作为练习


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

bind
获取打开的端口,
connect
尝试连接到目标
listen
端口。它们是分开的,以便端口重用。这并没有达到系统选择端口的目的。哦,对不起,我完全误解了这个问题。我认为用户必须同时选择绑定地址和端口。嗯,那可能是因为这是一个有趣的案例。。。
clnt_addr.sin_addr.s_addr = inet_addr("192.168.0.1");