我试图解决以下介绍POSIX套接字锻炼:POSIX套接字bind()的练习
写TCP呼应客户端实现“使系统同时选择地址和端口使用绑定()”。
(我假设“系统”是指OS)。
我不明白为什么一个bind()的调用是在必要时连接()执行上述方式绑定(纠正我,如果我不正确的)。另外,为了完成这种行为,提供给bind()调用的套接字地址需要sin6_addr和sin6_port的值?
我试图解决以下介绍POSIX套接字锻炼:POSIX套接字bind()的练习
写TCP呼应客户端实现“使系统同时选择地址和端口使用绑定()”。
(我假设“系统”是指OS)。
我不明白为什么一个bind()的调用是在必要时连接()执行上述方式绑定(纠正我,如果我不正确的)。另外,为了完成这种行为,提供给bind()调用的套接字地址需要sin6_addr和sin6_port的值?
你是对的,bind
调用是没有必要的。如果您没有bind
,系统将会在您connect
中选择源地址和源端口。
这是一个练习。这只是测试你是否知道如何使用bind
这种方式。
编辑:这是已被问到的相反。对不起,我想这个问题是关于选择IP地址和端口的用户。感谢EJP指出了这一点。
This应该是你要找的。
,这应该是最有趣的部分:
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地址,并且会为你的套接字分配一个随机源端口。
我不明白为什么一个bind()的调用是在必要时连接() 执行在上述方式绑定(纠正我,如果我 不正确的)。
你是对的。
此外,什么样的价值观sin6_addr和sin6_port的是提供给绑定套接字地址必要 ()调用来完成此 行为?
INADDR_ANY for IPv4。我将把IPv6作为读者的练习。
您还应该指定零作为端口号,然后系统会选择。
'bind'获得一个开放端口,'connect'尝试连接到一个目标'listen'端口。它们被分开用于端口重用。 [更多信息](http://www.scottklement.com/rpg/socktut/bindapi。html) – Naszta